直接上代码:
public class TestString {
public static void main(String args[]) {
String str1 = "a" ;
String str2 = "b" ;
String str3 = "a" + "b“ ;
String str4 = str1+str2 ;
System.out.println(str3 == "ab") ; //true
System.out.println(str4 == "ab") ; //false
}
}
为什么会出现这种情况呢?
------解决方案--------------------
str3 和 "ab" 都是编译期生成的
str4是运行期才算的
------解决方案--------------------
刚看了一下class 字节码文件,真正的原因是:
1 java编译器将“a”,"b' ,“ab”都当作常量来对待,放在了常量池里。
2 java编译器在编译时会将“a”+"b" 直接编译为"ab"
3 jvm 实现str1+str2是通过StringBuilder来实现的,通过str1实例化一个StringBulider,然后append str2.
综上三点,结果显而易见
------解决方案--------------------
声明式 的string变量是存放在 constant pool中
new出来的string是一个对象,对象存放在haep中