String str1 = "hello2";
final String a = "hello";
String b = "hello";
String c = a + "2";
String d = b + "2";
System.out.println(str1 == c);
System.out.println(str1 == d);
结果:
true
false
为什么第二个结果为false?这是什么原理呢?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
final变量在编译期间就已经确定了值,然后这个值是被存储到运行时数据区域中的常量池中的。
而你使用b+"2",是使用了引用变量b, JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即b+"2"无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给d。所以上面程序的结果也就为false。
如果改成String d = "hello" + "2";那么str1==d就是true了,因为d本质上也是常量了。