String a = “abc”和String b = new String(“abc”)的区别

2,630 阅读1分钟

首先,a==b 为false。a指代常量池中“abc”的地址,而b指代堆中“abc”的地址。

String a = “abc”;

1.栈中开辟一块空间存放  
2.String池中开辟一块空间存“abc”  
3.指针a指向常量池中的“abc”  
4.a所指代的地址即为常量池中“abc”的地址,a==“abc”为true

String b = new String(“abc”);

1.栈中开辟一块空间存放b  
2.堆中开辟一块空间存放一个新建的string对象“abc”  
3.指针b指向堆中的“abc”  
4.b指代的是 堆中“abc”的地址,而常量“abc”存在常量池中,故 b==“abc”为false

注意 :通过new产生的对象,会先去常量池检查有没有“abc”,如果没有,先在常量池中创建一个该对象,再在堆中拷贝一个常量池中的“abc” 。如果有直接创建拷贝对象。

有道面试题: String s = new String(“xyz”); 产生几个对象?
答:一个或两个。
    如果常量池中没有,就创建一个“xyz”,再创建一个堆中的拷贝对象。
    如果有,就直接创建一个堆中拷贝对象。

参考:String s = "abc" 和 String s = new String("abc") 的区别