import java.lang.String;
public class Test {
public static void main(String[] args) {
String a1="ka";
String a2="ka";
System.out.println("a1==a2? "+(a1==a2));
String a3="k";
String a4=new String("k");
System.out.println("a3==a4? "+(a3==a4))
System.out.println("a3==a4? "+(a3==a4.intern()));
String a5="k";
String a6=a4+"a";
System.out.println("a1==a6? "+(a1==a6));
}
}
我得到的输出:
a1==a2? true
a3==a4? false
a3==a4? true
a1==a6? false
您错误地比较了字符串(因为实际上是在比较引用)
java中的String类是在java.lang包中定义的,它就是那个类,而不是像int或boolean这样的基元。
在Java中,字符串是不可变的,并且是最终形式,在这种情况下,JVM使用字符串池存储所有字符串对象。
我们可以像任何普通的Java类一样使用new运算符来创建String对象,也可以使用双引号(字面赋值)来创建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为true。
但是当您这样做时:
String s3 = new String("abc");
String s4 = new String("abc");
您正在使用new运算符,因此JVM不会检查堆中是否已有字符串,它只会为s4分配一个新空间,因此s3 == s4 ??? 当然不。
请查看下面的图片,以获取更多说明性示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句