今天記錄一下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 }
輸出結果:
謝謝大家,今天就講到這裡了,如有錯誤望及時提出來哦