hashCode 和 equals 的區別


今天記錄一下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 }

 

輸出結果:

 

 謝謝大家,今天就講到這里了,如有錯誤望及時提出來哦

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM