class StringTest {
public static void main(String[] args) {
String str1 = "Hi there";
String str2 = new String("Hi there");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
}
输出结果出来了:
False
true
为什么即使str1和str2看起来相等,第一个输出也是假的?
答案 0 :(得分:6)
==
比较变量的内容。 (你很清楚intA == intB
。)
String
变量包含String
对象的引用,因此==
将比较引用。
在
String str1 = "Hi there";
String str2 = new String("Hi there");
str1
和str2
将引用不同的字符串对象,因此包含不同的引用,因此str1 == str2
将产生false
。
str1.equals(str2)
会比较str1
和str2
所指的对象,正如您所指出的那样,它会产生true
。
答案 1 :(得分:1)
因为如果你使用new
运算符,它会在内存中创建一个新引用。
==比较两个不相同的对象的引用。
使用equals比较内容。
答案 2 :(得分:0)
作为aioobe答案的补充:你应该使用equals方法比较对象。对象上的==运算符将比较两个对象的引用是否指向相同的内存地址。
答案 3 :(得分:0)
==
比较object reference contents
即str1
和str2
而非object contents
,而equals()
确实比较object contents
,即{{1} }}
同时检查:
(objects pointed by str1 and str2)
str1 == str3 =>真
这是因为JVM以不同的方式处理字符串文字。查看here
答案 4 :(得分:0)
在java中,当您使用new
关键字创建对象时,它们会在某个位置的堆中创建。
即使您使用str3
创建第三个引用变量new
,如果与str2
进行比较引用,它也会给您错误
String str1 = "Hi there";
String str2 = new String("Hi there");
String str3 = new String("Hi there");
str2==str3 gives you false
因此,当您compare
object
的值使用equals
而不是reference
时。