从内存角度去分析String s1= "abc"与String s2 = new String("abc")的问题
相信大家经常见到这样的问题:
String s1 = "abc";
String s2 = new String("acb");
两者有什么区别?
下面我将用内存分配的角度去分析这个问题,一般它们所涉及的内存区有三个,分别是栈,堆,常量池
当执行String s1 = "acb"时,首先它会在栈里创建一个s1的引用,然后再去常量池里查有“abc”这个字符串,如果有,则执行指向它,若没有则,新建一个放到常量池里,如下图:
当执行String s2 = new String("abc");首先它会在栈里创建一个s2的引用,然后在堆中再开辟一块空间来存放“abc”,如下图:
so,从以上两图可以看出,s1,s2两个引用分别指向不同的值
所以s1 == s2 为 false,引用地址不同
s1.equals(s2) 为true//值相同