通过==和equals()比较两个字符串的示例会得到不同的结果吗?

时间:2016-01-05 18:47:55

标签: java string string-literals

a == b何时为真但a.equals(b)为假,反之亦然?

我知道equals()用于比较字符串的值和= =来检查两个变量是否指向String对象的同一个实例。 但在这种情况下,这两者会有所不同吗?

3 个答案:

答案 0 :(得分:7)

考虑这段代码,

String str1 = "ABC";
String str2 = new String("ABC");
System.out.println(str1==str2); // false
System.out.println(str1.equals(str2)); //true

原因是当您编写String str1="ABC"时,此字符串保存在字符串池中,String str2 = new String("ABC")中创建新对象如果它已经存在,它将不会检查字符串池。但由于两个字符串的内容相同,等于方法返回true。

答案 1 :(得分:2)

虽然大多数编译器都会实习字符串

a = "Foo";
b = "Foo";
System.out.println(a == b);

通常会打印True,你总是可以构造你知道相同的字符串,但编译器不会:

a = "Foo";
b = "Fo";
c = "o";
System.out.println((a == b + c));

这将始终打印False,而a.equals(b + c)始终为True。基本上,不能保证具有相同内容的字符串将指向同一个对象。

答案 2 :(得分:0)

字符串本质上是不可变的。所以,当我们这样做时,

String a1 = "a";
String a2 = "a";

实际上在内存中,只创建了一个字符串“a”的实例。 a1和a2都指向同一个实例。

这就是为什么,a1 == a2a1.equals(a2)都是正确的。

但是,在此,

String a1 = "a";
String a2 = new String("a");

我们明确地创建了一个新的String实例。所以,a1.equals(a2)将是真的。但是a1 == a2不会。