今天記錄一下hashCode的知識,以前都沒有怎么接觸過的,感覺還是很陌生,專門去學習了一下
首先我最大的問題就是hashCode究竟是干什么 的,現在也一知半解了吧,
哈希值是一個對象的地址值,是一個邏輯地址,是模擬出來得到地址,不是數據實際存儲的物理地址。而hashCode()就是尋找哈希值的一個方法
那又要為什么要有這個hashCode() 呢?
為了減少equals()的使用次數,提高執行效率(說的比較不全面,但自己能理解就好,下面通過具體講解就通了)
hashCode() 和 equals()方法的作用(分為兩種情況)
1、如果類中不重寫他們:
hashCode():返回對象的地址值
equals(): 比較兩個值的地址
2、如果類中重寫了:
hashCode(): 根據對象的成員變量,返回一個整數
equals():比較兩個值是否相等
hashCode 和 equals 重寫后比較兩個對象是否相等
如果兩個對象比較的equals()相等,那么這兩個對象的hashCode()肯定相等,就是說equals()是絕對靠譜的
如果兩個對象比較的hashCode()相等,那么equals()去做比較卻不一定相等,就是說hashCode()不是絕對可靠的
通過hashCode()和 equals()搭配是如何提高效率的
對於一個對象中有大量的成員信息,只用equals()比較效率會比較低
可以先通過hashCode() 比較,如果不相等,則兩個對象一定不同,如果相等,那就用equals()進行比較,這樣hashCode()方法可以給我們比較出大部分對象的比較,從而提高效率
最后講講他們兩個搭配的應用
HashSet集合都知道吧,它的特點就是無序,元素唯一,主要靠的就是重寫hashCode()和equals()方法:
下面用代碼演示:
1 //建立JavaBean 2 import java.util.Objects; 3 4 public class HashSetTest { 5 private String name; 6 private int age; 7 public String getName() { 8 return name; 9 } 10 public void setName(String name) { 11 this.name = name; 12 } 13 public int getAge() { 14 return age; 15 } 16 public void setAge(int age) { 17 this.age = age; 18 } 19 public HashSetTest(String name, int age) { 20 this.name = name; 21 this.age = age; 22 } 23 @Override 24 public String toString() { 25 return "HashSetTest{" + 26 "name='" + name + '\'' + 27 ", age=" + age + 28 '}'; 29 } 30 public HashSetTest() { 31 } 32 // 重寫equals()和hashCode()方法 33 @Override 34 public boolean equals(Object o) { 35 if (this == o) return true; 36 if (o == null || getClass() != o.getClass()) return false; 37 HashSetTest that = (HashSetTest) o; 38 return age == that.age && 39 Objects.equals(name, that.name); 40 } 41 @Override 42 public int hashCode() { 43 return Objects.hash(name, age); 44 } 45 }
測試代碼:
1 import java.util.HashSet; 2 import java.util.Iterator; 3 4 public class HashSetTest1 { 5 public static void main(String[] args) { 6 HashSetTest hashSetTest = new HashSetTest("張三",12); 7 HashSetTest hashSetTest1 = new HashSetTest("李四",34); 8 HashSetTest hashSetTest2 =new HashSetTest("張三",12);//定義一個前面出現過的對象,那么后面就不會加入到hashSet集合中 9 HashSet<HashSetTest> hashSet = new HashSet<>(); 10 //添加對象到hashSet集合中,此時就會調用hashCode和equals方法 11 hashSet.add(hashSetTest); 12 hashSet.add(hashSetTest1); 13 hashSet.add(hashSetTest2); 14 //遍歷hashSet集合 15 Iterator iterator =hashSet.iterator(); 16 while (iterator.hasNext()){ 17 System.out.println(iterator.next()); 18 } 19 } 20 }
輸出結果:
謝謝大家,今天就講到這里了,如有錯誤望及時提出來哦