我在下面的代码中使用==,并打印出“等于!”,为什么?有人可以解释为什么这两个不同的字符串A和B是平等的吗?

public class test
{
    public static void main()
    {
        String a = "boy";
        String b = "boy";

        if(a == b)
        {
            System.out.println("Equals!");
        }
        else
        {
            System.out.println("Does not equal!");
        }
    }
}
有帮助吗?

解决方案

这是因为 String 实习.

Java(JVM)保留了 String 用于保存内存的文字。因此,每当您创建一个 String 像这样:

String s = "String";

Java“实习生”字符串。但是,如果您创建 String 像这样:

String s = new String("String");

Java不会自动实习 String. 。如果您以这种方式创建字符串,则代码将产生不同的结果。

快速的Google搜索 揭示了很多关于 String 实习。

其他提示

本文将详细解释:

Java中的==和equals()有什么区别?

执行字符串a =“男孩”之后; JVM将字符串“男孩”添加到字符串池中,并在代码的下一行中再次遇到字符串B =“男孩”;在这种情况下,JVM已经知道该字符串已经存在于池中,因此不会创建一个新的字符串。因此,两个字符串A和B都指向相同的字符串,它们指向相同的参考。

String a = "boy"; 将创建一个带有值(“男孩”)的新字符串对象,将其放在字符串池中并制作 a 参考它。

当口译员看到 String b = "boy";, ,首先检查是否是否 string "boy" 存在于字符串池中,由于它存在,因此没有创建新对象,并且 b 是为了指代相同的对象 a 指的是。

由于两种参考都包含相同的内容,它们通过相等性测试。

因为运行时间将具有一个字符串池,并且当您需要分配一个新的常数字符串时,如果池包含池,则在池内的运行时间查看,则将变量点设置为池中的同一字符串对象。

但是您绝对不应依靠此检查来检查内容字符串等于。您应该使用该方法: equals

每当我们创建一个类似下面的字符串时:

String str1 = "abc";
String str2 = "abc";

JVM将检查 str2 = "abc" 在字符串常数池中,如果存在,则不会创建一个新的字符串,而是指向字符串常数池中的字符串。

但是如果这样 String str = new String("abc"); 它将始终创建一个新的字符串对象,但我们可以使用 intern() 功能强迫JVM查看字符串常数池。

如上所述,在 '==' 比较,运行时间将调查 String 弦的存在。但是,在垃圾收集期间或记忆问题期间,虚拟机可能会破坏字符串池。这 "==" 操作员可能会或可能不会返回正确的值。

教训 - 始终使用 equals() 进行比较。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top