字符串常量的初始化

一、使用直接量赋值
当执行String str = "abc"时,先在Java的String常量池中创建一个"abc"对象,然后在变量栈中创建str变量,并指向该对象。
当执行String str2 = "abc"时,str2会指向这个已经存在的对象,这是一种节省资源的做法。
无论调用多少次,内存中都只有一个"abc"对象,str和str2都被确认为字符串常量,这种现象称为“字符串驻留”,这个过程在编译时就确定了。

二、使用new String
第一次调用String str = new String("abc")时,首先在String池中创建一个"abc"对象,编译时无法确定str的值。
执行时,因为调用了new,就会在堆内存中新建一个对象,因此会在堆内存中新建一个String对象。
所以以下代码返回false:

String str = "abc";
String str2 = new String("abc");
System.out.println(str == str2);

三、使用变量+直接量
考察以下代码:

String s = "jj";
String s2 = "j";
String s3 = s + s2;
String s4 = "jjj";
System.out.println(s3 == s4); 
\\返回false

字符串驻留发生在编译过程,而语句String s3 = s + s2在编译时不能确认s3是否存在于String池,因此s3在编译结束后仍是一个字符串变量。
上述代码在执行时会创建一个StringBuffer对象,对s和s2进行拼接,因此也相当于在堆内存中new了一个新对象。

你可能感兴趣的:(字符串常量的初始化)