Java基础
Java基础
try-catch-finally 如何使用?
-
try
块 : 用于捕获异常。其后可接零个或多个catch
块,如果没有catch
块,则必须跟一个finally
块。 -
catch
块 : 用于处理 try 捕获到的异常。 -
finally
块 : 无论是否捕获或处理异常,finally
块里的语句都会被执行。当在try
块或catch
块中遇到return
语句时,finally
语句块将在方法返回之前被执行。注意:不要在 finally 语句块中使用 return! 当 try 语句和 finally 语句中都有 return 语句时,try 语句块中的 return 语句会被忽略。这是因为 try 语句中的 return 返回值会先被暂存在一个本地变量中,当执行到 finally 语句中的 return 之后,这个本地变量的值就变为了 finally 语句中的 return 返回值。
String s1 = new String("abc");这句话创建了几个字符串对象?
会创建 1 或 2 个字符串对象。
1、如果字符串常量池中不存在字符串对象“abc”的引用,那么会在堆中创建 2 个字符串对象“abc”。
一个是new String自身的,一个是new出来给常量池的
2、如果字符串常量池中已存在字符串对象“abc”的引用,则只会在堆中创建 1 个字符串对象“abc”。
intern 方法有什么作用?(可结合上一问)
直接使用双引号声明出来的String对象会直接存储在常量池中。比如:
String info="atguigu.com";
- new String("a") + new String("b");常量池中只存在"a"、"b"不存在"ab"
字符串常量池存放在堆中(JDK1.8)
- 为什么?因为堆中会频繁进行GC
- 静态变量也在堆中存放
字符串常量池只存放引用,但是不存放对象(JDK1.8)
String.intern()
是一个 native(本地)方法,其作用是将指定的字符串对象的引用保存在字符串常量池中,可以简单分为两种情况:
- 如果字符串常量池中保存了对应的字符串对象的引用,就直接返回该引用。
- 如果字符串常量池中没有保存了对应的字符串对象的引用,那就在堆中创建一个字符串对象,保存对象引用到字符串常量池,并返回对象的引用。
已经存在,则返回常量池中对象的引用地址
不存在,堆中创建对象,保存引用到常量池中,并返回该对象引用地址
/**
* StringIntern.java中练习的拓展:
*
*/
public class StringIntern1 {
public static void main(String[] args) {
//执行完下一行代码以后,字符串常量池中,是否存在"11"呢?答案:不存在!!
String s3 = new String("1") + new String("1");//new String("11")
//在字符串常量池中生成对象"11",代码顺序换一下,实打实的在字符串常量池里有一个"11"对象
String s4 = "11";
String s5 = s3.intern();
// s3 是堆中的 "ab" ,s4 是字符串常量池中的 "ab"
System.out.println(s3 == s4);//false
// s5 是从字符串常量池中取回来的引用,当然和 s4 相等
System.out.println(s5 == s4);//true
}
}
public class StringExer2 {
public static void main(String[] args) {
String s1 = new String("ab");//执行完以后,会在字符串常量池中会生成"ab"
//new String("ab")会创建两个对象。两个都在堆中,一个自身的,一个常量池的
s1.intern();//此时常量池中已存在,返回的是常量池中的对象
String s2 = "ab";
System.out.println(s1 == s2);//false
}
}
public class StringExer2 {
public static void main(String[] args) {
String s1 = new String("a") + new String("b");//执行完以后,不会在字符串常量池中会生成"ab"
s1.intern();//将当前对象的地址赋值给常量池
String s2 = "ab";
System.out.println(s1 == s2); // true
}
}
this是什么
当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this。
因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。因此,this不能代表当前class,只能代表当前class的实例
虚引用是什么?
虚引用(PhantomReference)
"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
虚引用主要用来跟踪对象被垃圾回收的活动。
虚引用与软引用和弱引用的一个区别在于: 虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
特别注意,在程序设计中一般很少使用弱引用与虚引用,使用软引用的情况较多,这是因为软引用可以加速 JVM 对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。