使用equals()方法时,为什么具有相同数据的两个对象不相等

public class Account { String account; double balance; Account(String account, double balance) { this.account = account; this.balance = balance; } } public class AccountTest { public static void main(String[] args) { Account a1 = new Account("Sandy", 1000); Account a2 = new Account("Sandy", 1000); System.out.println(a1.equals(a2)); } } 

当我执行它显示“假”但对象包含变量中的相同数据时。解释。

因为默认情况下对象基于equals(Object obj)检查相等性。

类Object的equals方法实现了对象上最具辨别力的等价关系; 也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(x == y的值为true)。

如果要在类中使用equals()方法检查相等性,则必须重写Object类的equals()方法。
how-to-override-equals-method-in-java ,如下所示:

 @Override public boolean equals(Object obj) { // your implementation } 

每当重写等于 Object类的方法时 ,你应该总是覆盖hashCode() 。

#Effective Java,Joshua Bloch撰写

您必须覆盖覆盖equals()的每个类中的hashCode()。 如果不这样做,将导致违反Object.hashCode()的常规合同,这将阻止您的类与所有基于散列的集合(包括HashMap,HashSet和Hashtable)一起正常运行。

您需要覆盖equals()方法,并在想要比较它们的值时使用它。

 @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Account other = (Account) obj; if ((this.account== null) ? (other.account!= null) : !this.account.equals(other.account)) { return false; } if (this.balance!= other.balance) { return false; } return true; } 

但为什么我必须超越平等()

你需要覆盖equals

 @Override public boolean equals(Object obj) { if (!(obj instanceof Account)) return false; Account that = (Account) obj; return (account == null ? that.account == null : account .equals(that.account)) && balance == that.balance; } 

我几乎忘了在覆盖hashCode时覆盖hashCode

 @Override public int hashCode() { int hash = 17; hash = 37 * hash + (account == null ? 0 : account.hashCode()); long l = Double.doubleToLongBits(balance); hash = 37 * hash + (int) (l ^ (l >>> 32)); return hash; } 

你没有覆盖equals 。 默认equalsObjectinheritance的实现,当且仅当两个变量指向同一个对象时才返回true

覆盖equals检查字段相等(和hashCode ,如果你在它)。

Object.equals()方法正在测试以查看被比较的两件事情是否是同一个对象。 虽然a1和a2包含相同的信息,但它们是内存中的不同对象。

如果要测试对象内部信息的相等性,可以让类实现Comparable接口并覆盖compareTo方法。

既然你没有覆盖.equals() (如果你这样做,你也必须覆盖.hashCode() ),你可以使用Object.equals()实现; 当且仅当对象引用相等时(即o1 == o2 ),此实现返回true。

您需要重写Object.equals()方法。

如果a1.balance==a2.balance ,它将显示为true 。 请注意, equals()比较对象而不是实际值。 为了能够比较一个对象,你必须覆盖equals()方法。

有关更多信息,请参见此处使用equals方法比较两个对象Java

Object类中的实现,即默认实现检查引用。 因此,如果引用相同则返回true,否则返回false。