首先如果hashcode相等的話,這兩個類也是不一定相等的,如果是反過來的話(通常情況下,如果兩個對象的內容相同,兩個對象的hashcode也是相同的)
hashcode()和equals()的關系:
(1)如果不創建“類對應的散列表的話”(就是當我們不會把一個類放到在HashSet, Hashtable, HashMap這種底層實現是以hashcode來去定位存儲位置的話),如果不是這種情況下的話,此時這個類的hashcode()和equals()是沒有一點關系的
(2)如果恰好用到了上面所說的“創建了類對應的散列表的話”,那么也就是你把這個類作為key來去存儲其他的value的話,這種情況下是可以進行比較的
- 如果兩個對象相等,那么它們的hashCode()值一定相同。這里的相等是指,通過equals()比較兩個對象時返回true。
- 如果兩個對象hashCode()相等,它們並不一定相等。
因為在散列表中,hashCode()相等,即兩個鍵值對的哈希值相等。然而哈希值相等,並不一定能得出鍵值對相等。補充說一句:“兩個不同的鍵值對,哈希值相等”,這就是哈希沖突。(若要判斷兩個對象是否相等,除了要覆蓋equals()之外,也要覆蓋hashCode()函數。否則,equals()無效。 )
public class test {
public static void main(String[] args) {
// 新建Person對象,
Person p1 = new Person("eee", 100);
Person p2 = new Person("eee", 100);
Person p3 = new Person("aaa", 200);
// 新建HashSet對象
HashMap map = new HashMap();
map.put(p1,"woshi---p1");
map.put(p2,"woshi---p2");
map.put(p3,"我是P3");
System.out.println(map.get(p1)+"---------------------");
System.out.println(map.get(p2)+"---------------------");
System.out.println(map.get(p3));
// 比較p1 和 p2, 並打印它們的hashCode()
System.out.printf("p1.equals(p2) : %s; p1(%d) p2(%d)\n", p1.equals(p2), p1.hashCode(), p2.hashCode());
}
/**
* @desc Person類。
*/
private static class Person {
int age;
String name;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "("+name + ", " +age+")";
}
}
}
輸出結果:
woshi—p1---------------------
woshi—p2---------------------
我是P3
p1.equals(p2) : false; p1(821270929) p2(1160460865)