我在下面的代码中使用==并打印出“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!");
}
}
}
答案 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查看字符串常量池。