JAVA String的问题

String s1 = "字符串";
String s2 = "字符串";
System.out.println(s1==s2);       //输出true

String s3 = new String("字符串");
String s4 = new String("字符串");
System.out.println(s3==s4);       //输出false

String s5 = "字"+"符串"; 
String s6 = "字符串";
System.out.println(s5==s6);       //输出true,编译阶段会将直接量直接计算出来,相当于省略+

String s7 = "字";
String s8 = "符串";
String s9 = s7 + s8;
String s10 = s7 + s8;
System.out.println(s9==s10);       //输出false,因为s9和s10是在运行阶段而不是编译阶段确定的

final String s11 = "字";
final String s12 = "符串";
String s13 = s11 + s12;
String s14 = s11 + s12;  
System.out.println(s3==s14);       //输出true,因为final会进行宏替换,如果final变量声明时就指定了初始值并且编译时就能确定,
                         		   //那么这个变量在编译时就全被替换为了确定下来的值,赋值语句就被忽略,相当于变量s11和s12不存在

以上我们知道了如果是直接量,不管是否使用了+连接,在内存中都相当于指向了同一个对象,因为直接量+会在编译阶段计算出来。但如果是变量形式的两个String类型相加,则会在运行时创建两个相同的对象。
综上编译阶段确定下来的相同的直接量Java只会创建一个对象,所有相同的引用变量都指向这个对象。

posted @ 2021-05-17 23:47  epiphanyy  阅读(10)  评论(0)    收藏  举报  来源