从内存角度去分析String s1= "abc"与String s2 = new String("abc")的问题

相信大家经常见到这样的问题:

String s1 = "abc";

String s2 = new String("acb");

两者有什么区别?

下面我将用内存分配的角度去分析这个问题,一般它们所涉及的内存区有三个,分别是栈,堆,常量池

当执行String s1 = "acb"时,首先它会在栈里创建一个s1的引用,然后再去常量池里查有“abc”这个字符串,如果有,则执行指向它,若没有则,新建一个放到常量池里,如下图:

从内存角度去分析String s1= "abc"与String s2 = new String("abc")的问题从内存角度去分析String s1= "abc"与String s2 = new String("abc")的问题

当执行String s2 = new String("abc");首先它会在栈里创建一个s2的引用,然后在堆中再开辟一块空间来存放“abc”,如下图:

从内存角度去分析String s1= "abc"与String s2 = new String("abc")的问题从内存角度去分析String s1= "abc"与String s2 = new String("abc")的问题

so,从以上两图可以看出,s1,s2两个引用分别指向不同的值

所以s1 == s2 为 false,引用地址不同

s1.equals(s2) 为true//值相同