日期:2014-05-20  浏览次数:20619 次

Java字符串内存地址
String ss1="a"+"bc";
String ss2="abc";
System.out.println(ss1==ss2);//true

ss1=ss1+"def";
ss2="abc"+"def";
System.out.println(ss1==ss2);//false---为什么?

------解决方案--------------------
不懂啊 等待大牛日经
------解决方案--------------------
貌似是ss1=ss1+"def";这行等号右面有变量的缘故。。。
------解决方案--------------------
确实有点日经。

String的享元模式,在编译时能立即确定的常量,才能比较好的发挥效用。而且目前这个效果已经是编译器优化后的了;没记错的话,老早以前的Java,第一条也没法true。

ss1=ss1+"def"; 运行时才知道ss1的内容,编译器还没那么聪明可以推断出ss1到这里的时候能是个啥。

------解决方案--------------------
编译期能确定相同的字符串才会指向常量池中同一个字符串
什么样的编译期就能确定呢?
那就是由常量来初始化的字符串

ss1=ss1+"def";
右侧有变量,所以编译期不能确定

不过再次强调,不需要研究和专这种问题
java 对此的实现有过改变,难保以后不改
搞清楚这个问题没有任何意义
------解决方案--------------------
引用:
编译期能确定相同的字符串才会指向常量池中同一个字符串
什么样的编译期就能确定呢?
那就是由常量来初始化的字符串

ss1=ss1+"def";
右侧有变量,所以编译期不能确定

不过再次强调,不需要研究和专这种问题
java 对此的实现有过改变,难保以后不改
搞清楚这个问题没有任何意义


就怕面试问这样的问题。。
------解决方案--------------------
关键是要弄懂==的含义。
==和equal不要用错了
------解决方案--------------------
编译期能确定相同的字符串才会指向常量池中同一个字符串

------解决方案--------------------
编译期能确定相同的字符串才会指向常量池中同一个字符串

学习