- 首先明确
hashCode()
和equals()
方法的关系:- 在Java中,
hashCode()
方法是用来获取对象的哈希码,这个哈希码主要用于哈希表(如HashMap
、HashSet
等数据结构)中确定对象的存储位置。equals()
方法用于比较两个对象是否在逻辑上“相等”。 - 根据Java的规范,如果两个对象通过
equals()
方法比较返回true
,那么它们的hashCode()
方法必须返回相同的值。但是,反过来并不一定成立。
- 在Java中,
- 当两个对象的
hashCode()
相同,它们的equals()
方法不一定返回true
。- 例如,假设有一个简单的
Person
类,它有两个属性name
和age
,重写hashCode()
方法时只考虑age
属性来生成哈希码,重写equals()
方法时考虑name
和age
两个属性。class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public int hashCode() { return Integer.hashCode(age); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof Person)) { return false; } Person other = (Person) obj; return this.name.equals(other.name) && this.age == other.age; } }
- 可以创建两个
Person
对象:Person p1 = new Person("Alice", 20);
和Person p2 = new Person("Bob", 20);
。这两个对象的hashCode()
方法返回相同的值(因为它们的age
都是20),但是它们的equals()
方法返回false
,因为name
属性不同。
- 例如,假设有一个简单的
所以,两个对象的hashCode()
相同,则equals()
方法不一定返回true
。