Java Strings混乱

时间:2016-03-03 08:32:49

标签: java

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

非常感谢详细说明。

2 个答案:

答案 0 :(得分:0)

执行new String(...)时,会在运行时对其进行评估,从而创建两个不同的实例,最终得到的s3 == s4false。当您使用StringBuilder并执行sb.toString()之类的操作时会发生同样的事情,这会在运行时再次进行评估。

例如,

StringBuilder sb = new StringBuilder();
String foo = sb.append("abc").toString();

String bar = new String("abc");

String foobar = "abc";

此处foobarfoobar都是不同的对象,因此foo == barfoo == foobar将评估为false

另一方面,s1 == s2返回true因为abc一个已声明,已存在于字符串池中,在这种情况下,两个对象都指向池中的相同引用。 / p>

答案 1 :(得分:-1)

java中的String类在java.lang包中定义,它就是,而不是像int或boolean这样的原语。

开发字符串以提供具有许多字符的操作,并且几乎在所有Java应用程序中通常使用

关于Java和字符串的一些有趣的事实:

Java中的immutable和final中的字符串,在这种情况下,JVM使用String Pool来存储所有String对象。

创建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 ???当然没有。

请查看下面的图片,以获得更具说明性的示例。

enter image description here