String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
String s4 = new String("abc");
if (s1 == s2) is giving true
while (s3 == s4) is giving false.
有人可以详细解释什么是String
池,堆,每行创建的对象数以及总共创建的对象数。
为什么s3==s4
正在提供false
?
非常感谢详细说明。
答案 0 :(得分:0)
执行new String(...)
时,会在运行时对其进行评估,从而创建两个不同的实例,最终得到的s3 == s4
为false
。当您使用StringBuilder
并执行sb.toString()
之类的操作时会发生同样的事情,这会在运行时再次进行评估。
例如,
StringBuilder sb = new StringBuilder();
String foo = sb.append("abc").toString();
String bar = new String("abc");
String foobar = "abc";
此处foo
,bar
和foobar
都是不同的对象,因此foo == bar
或foo == foobar
将评估为false
。
另一方面,s1 == s2
返回true
因为abc
一个已声明,已存在于字符串池中,在这种情况下,两个对象都指向池中的相同引用。 / p>
答案 1 :(得分:-1)
java中的String类在java.lang包中定义,它就是类,而不是像int或boolean这样的原语。
开发字符串以提供具有许多字符的操作,并且几乎在所有Java应用程序中通常使用
Java中的immutable和final中的字符串,在这种情况下,JVM使用String Pool来存储所有String对象。
我们可以使用new运算符创建String对象,就像任何普通的java类一样,或者我们可以使用双引号(文字赋值)来创建String对象。
String类中有几个构造函数可以从char数组,字节数组,StringBuffer和StringBuilderetc等中获取String。
当我们使用双引号创建String时,JVM会在String池中查找是否存储具有相同值的任何其他String。如果找到,它只返回对该String对象的引用,否则它会创建一个具有给定值的新String对象并将其存储在String池中。
当我们使用new运算符时,JVM会创建String对象,但不会将其存储到String Pool中。我们可以使用intern()方法将String对象存储到String池中,或者如果池中已存在具有相等值的String,则返回引用。
所以当你这样做时
String s1 = "abc";
String s2 = "abc";
在StringPool中检查那些,因为s1已存在,s2将采用相同的引用,因此,s1 == s2为真。
但是当你这样做时:
String s3 = new String("abc");
String s4 = new String("abc");
您正在使用 new运算符,因此JVM没有检查堆中是否已存在字符串,它只会为s4分配 new 空间,所以是s3 == s4 ???当然没有。
请查看下面的图片,以获得更具说明性的示例。