检查2个不同的等实例(包含示例)

时间:2010-09-07 03:56:00

标签: java string reference equality string-literals

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

6 个答案:

答案 0 :(得分:10)

这是由于 String实习

Java(JVM)保留用于节省内存的String文字集合。因此,每当您像这样创建String时:

String s = "String";

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

String s = new String("String");

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

A quick Google search显示了很多关于String实习的好资源。

答案 1 :(得分:2)

本文将详细解释:

What is the difference between == and equals() in Java?

  

执行String a =后   “男孩”; JVM添加了   字符串“boy”到字符串   池和代码的下一行,它   遇到String b =“boy”;在这种情况下,JVM已经存在   知道这个字符串已经存在   在游泳池,所以它不会创建一个   新字符串。所以字符串a和b都指向相同的字符串,这意味着它们   指向相同的参考。

答案 2 :(得分:2)

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

当解释器看到String b = "boy";时,它首先检查字符串池中是否存在string "boy",因为它存在,没有创建新对象并且{{1用于引用b所指的同一对象。

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

课程 - 始终使用equals()进行比较。

答案 5 :(得分:0)

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

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

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

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