当前位置: 代码迷 >> J2SE >> 关于String 的疑义
  详细解决方案

关于String 的疑义

热度:81   发布时间:2016-04-23 20:36:27.0
关于String 的疑问
直接上代码:

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中
  相关解决方案