检查2个不同的相等实例(包括示例)
-
01-10-2019 - |
题
我在下面的代码中使用==,并打印出“等于!”,为什么?有人可以解释为什么这两个不同的字符串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
实习。
其他提示
本文将详细解释:
执行字符串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()
进行比较。