相信大家经常见到这样的问题:
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//值相同
本文通过内存分配角度分析了Java中直接赋值字符串与使用new关键字创建字符串的区别。指出两者在内存中的存放位置不同,前者位于常量池,后者位于堆中,导致即使内容相同,其对象也不相等。
1万+

被折叠的 条评论
为什么被折叠?



