我想澄清一下我是否正确理解了这一点:
==
是参考比较,即两个对象都指向相同的存储位置.equals()
计算对象中值的比较通常,您的问题的答案是 “是”,但是...
.equals(...)
将只比较它要比较的内容,不会多也不会少。equals(Object o)
Object#equals(Object o)
方法。根据对象 API,这与==
相同;也就是说,当且仅当两个变量都引用相同的对象(如果它们的引用是相同的)时,它才返回 true。因此,您将测试对象相等性而不是功能相等性。equals
,请始终记住重写hashCode
,以免 “违反合同”。根据 API,如果两个对象equals
方法显示等效hashCode()
方法返回的结果必须相同。反过来未必是真实的。关于 String 类:
equals()方法比较 String 实例内部(在堆上)的 “值”,而不管两个对象引用是否引用相同的 String 实例。如果任何两个 String 类型的对象引用都引用同一个 String 实例,那就太好了!如果两个对象引用引用了两个不同的 String 实例,则没有任何区别。它是被比较的每个 String 实例中的 “值”(即:字符数组的内容)。
另一方面,“==”运算符比较两个对象引用的值,以查看它们是否引用相同的String 实例。如果两个对象的值均引用 “引用” 相同的 String 实例,则布尔表达式的结果将为 “true” .. duh。另一方面,如果两个对象引用的值 “引用”不同的 String 实例(即使两个 String 实例都具有相同的 “值”,即每个 String 实例的字符数组的内容相同),则布尔表达式的结果将为 “false”。
与任何解释一样,让它沉入。
我希望这可以使事情变得简单。
根据您是在谈论 “原始” 还是 “对象类型”,有一些细微的差异。如果您谈论的是 “静态” 或“非静态” 成员,也可以这样说;您也可以混合以上所有内容...
这是一个示例(您可以运行它):
public final class MyEqualityTest
{
public static void main( String args[] )
{
String s1 = new String( "Test" );
String s2 = new String( "Test" );
System.out.println( "\n1 - PRIMITIVES ");
System.out.println( s1 == s2 ); // false
System.out.println( s1.equals( s2 )); // true
A a1 = new A();
A a2 = new A();
System.out.println( "\n2 - OBJECT TYPES / STATIC VARIABLE" );
System.out.println( a1 == a2 ); // false
System.out.println( a1.s == a2.s ); // true
System.out.println( a1.s.equals( a2.s ) ); // true
B b1 = new B();
B b2 = new B();
System.out.println( "\n3 - OBJECT TYPES / NON-STATIC VARIABLE" );
System.out.println( b1 == b2 ); // false
System.out.println( b1.getS() == b2.getS() ); // false
System.out.println( b1.getS().equals( b2.getS() ) ); // true
}
}
final class A
{
// static
public static String s;
A()
{
this.s = new String( "aTest" );
}
}
final class B
{
private String s;
B()
{
this.s = new String( "aTest" );
}
public String getS()
{
return s;
}
}
您可以通过以下链接比较 “==“(相等运算符)和 “ .equals(...)”(java.lang.Object 类中的方法)的解释: