java“ ==”异常行为

粉碎机
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
  • a1 === a2为true,因为第5行不会在字符串池区域中创建新的String文字。仅返回对先前创建的字符串的引用。
  • a3 == a4?由于a4为false,因此将引用String对象,而不是字符串池区域中字符串中的字符串。我的问题是a3是否引用字符串常量而不是String对象,它如何使用String类的方法?
  • a4.intern()将返回对字符串池中的字符串的引用,该引用恰好与a3相同
  • a6 = a4 +“ a”将创建一个新的字符串“ ka”。但这实际上利用了StringBuilder类及其append方法。然后使用toString()将其转换为字符串。此过程是否将新创建的字符串“ ka”存储在字符串池区域中?由于字符串已经在池中,因此第12行的代码应返回对该字符串的引用。那么a1 == a6应该是true.rt?我是Java新手。请指导我我在哪里做错了?
ΦXocę웃Пepeúpatsu

您错误地比较了字符串(因为实际上是在比较引用)

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章