执行如下的java代码
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2;
String e = d + 2;
System.out.println(b == d);
System.out.println((a == c));
System.out.println((a == e));
执行结果
true
true
false
原因
加了final修饰后,在编译时,java会把b当成常量来处理,实际编译就会变成
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = "hello" + 2;
String e = d + 2;
......
所以a创建后会放入常量池里,c则是两个常量拼接,直接从常量池里找,所以a和c指向同一个地址;而e执行的是变量和常量相加,实际会产生一个stringBuilder对象,会另外分配一块内存,因此e和a的地址不同,比较结果为false
本文探讨了Java中String常量与变量拼接的底层机制。通过实例分析,解释了当字符串拼接涉及final修饰符时,Java如何在编译阶段优化处理,导致不同的对象引用情况。揭示了在常量池中查找与新建对象之间的区别。

被折叠的 条评论
为什么被折叠?



