使用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
。 默认equals
从Object
inheritance的实现,当且仅当两个变量指向同一个对象时才返回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。
- 将.properties文件放在Eclipse项目中的位置?
- EasyMock中’same’和’eq’之间的区别
- 如何从Eclipse插件中获取包浏览器中的选定节点
- 春豆错误
- JDK9:发生了非法reflection访问操作。 org.python.core.PySystemState
- 如何将JSON字符串转换为Java对象的列表?
- 如何使用一个DataSource以编程方式更改Spring中的数据库?
- java.lang.NoSuchMethodError:com.google.common.io.Closeables.closeQuietly(Ljava / io / Closeable;)V
- 使用自定义typeadapter,json中的jsonwriter添加对象