8

我在下面的代码中使用 == 并打印出“等于!”,为什么?有人可以解释为什么这两个不同的字符串 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!");
        }
    }
}
4

6 回答 6

10

这是由于String实习

StringJava(JVM)保留了用于节省内存的文字集合。所以,每当你创建一个String这样的:

String s = "String";

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

String s = new String("String");

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

一个快速的谷歌搜索揭示了很多关于String实习的好资源。

于 2010-09-07T04:00:43.450 回答
2

本文将详细解释:

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

执行 String a = "boy" 后;JVM 将字符串“boy”添加到字符串池中,在代码的下一行,它再次遇到 String b = “boy”;在这种情况下,JVM 已经知道该字符串已经存在于池中,因此它不会创建新字符串。所以字符串 a 和 b 都指向同一个字符串,这意味着它们指向同一个引用。

于 2010-09-07T03:58:08.553 回答
2

String a = "boy";将创建一个具有值(“boy”)的新字符串对象,将其放入字符串池中并a引用它。

当解释器看到String b = "boy";时,它首先检查是否string "boy"存在于字符串池中,因为它存在,所以不会创建新对象并b使其引用所引用的同一对象a

由于两个引用包含相同的内容,因此它们通过了相等性测试。

于 2010-09-07T04:01:12.887 回答
1

因为运行时会有一个字符串池,而当你需要分配一个新的常量字符串时,运行时会在池内查找,如果池中包含它,那么就将变量指向池内的同一个String对象。

但是你永远不应该依赖它来检查内容字符串是否相等。您应该使用以下方法:equals

于 2010-09-07T04:00:31.000 回答
0

正如上面正确解释的那样,在'=='比较的情况下,运行时将查看String池中是否存在字符串。但是,在垃圾回收或内存问题期间,虚拟机很可能会破坏字符串池。因此,"=="操作员可能会或可能不会返回正确的值。

课程 - 始终equals()用于比较。

于 2010-09-07T04:07:04.793 回答
0

每当我们创建如下字符串时:

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

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

但在这种情况下,String str = new String("abc");它总是会创建一个新的字符串对象,但我们可以使用intern()函数来强制 JVM 查看字符串常量池。

于 2010-09-07T09:15:09.777 回答