一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 詳解Java中用于查找對象哈希碼值的hashCode()函數

詳解Java中用于查找對象哈希碼值的hashCode()函數

2020-05-06 11:33馮立彬 JAVA教程

Java中入HashMap等一些鍵值對應的結構,基本上都可以用hashCode()來查找值,接下來我們就來詳解Java中用于查找對象哈希碼值的hashCode()函數:

理解
hashCode() 的作用是獲取哈希碼,也稱為散列碼;它實際上是返回一個int整數。這個哈希碼的作用是確定該對象在哈希表中的索引位置。
hashCode() 定義在JDK的Object.java中,這就意味著Java中的任何類都包含有hashCode() 函數。
雖然,每個Java類都包含hashCode() 函數。但是,僅僅當創建并某個“類的散列表”(關于“散列表”見下面說明)時,該類的hashCode() 才有用(作用是:確定該類的每一個對象在散列表中的位置;其它情況下(例如,創建類的單個對象,或者創建類的對象數組等等),類的hashCode() 沒有作用。
上面的散列表,指的是:Java集合中本質是散列表的類,如HashMap,Hashtable,HashSet。
也就是說:hashCode() 在散列表中才有用,在其它情況下沒用。在散列表中hashCode() 的作用是獲取對象的散列碼,進而確定該對象在散列表中的位置。
我們都知道,散列表存儲的是鍵值對(key-value),它的特點是:能根據“鍵”快速的檢索出對應的“值”。這其中就利用到了散列碼!
散列表的本質是通過數組實現的。當我們要獲取散列表中的某個“值”時,實際上是要獲取數組中的某個位置的元素。而數組的位置,就是通過“鍵”來獲取的;更進一步說,數組的位置,是通過“鍵”對應的散列碼計算得到的。
下面,我們以HashSet為例,來深入說明hashCode()的作用。
假設,HashSet中已經有1000個元素。當插入第1001個元素時,需要怎么處理?因為HashSet是Set集合,它允許有重復元素。
“將第1001個元素逐個的和前面1000個元素進行比較”?顯然,這個效率是相等低下的。散列表很好的解決了這個問題,它根據元素的散列碼計算出元素在散列表中的位置,然后將元素插入該位置即可。對于相同的元素,自然是只保存了一個。
由此可知,若兩個元素相等,它們的散列碼一定相等;但反過來確不一定。在散列表中,
1、如果兩個對象相等,那么它們的hashCode()值一定要相同;
2、如果兩個對象hashCode()相等,它們并不一定相等。
注意:這是在散列表中的情況。在非散列表中一定如此!

示例
我們來看一個具體的示例吧,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class HashTest {
  private int i;
 
  public int getI() {
    return i;
  }
 
  public void setI(int i) {
    this.i = i;
  }
 
  public int hashCode() {
    return i % 10;
  }
 
  public final static void main(String[] args) {
    HashTest a = new HashTest();
    HashTest b = new HashTest();
    a.setI(1);
    b.setI(1);
    Set<HashTest> set = new HashSet<HashTest>();
    set.add(a);
    set.add(b);
    System.out.println(a.hashCode() == b.hashCode());
    System.out.println(a.equals(b));
    System.out.println(set);
  }
}

這個輸出的結果:

?
1
2
3
true
false
[com.ubs.sae.test.HashTest@1, com.ubs.sae.test.HashTest@1]

以上這個示例,我們只是重寫了hashCode方法,從上面的結果可以看出,雖然兩個對象的hashCode相等,但是實際上兩個對象并不是相等;,我們沒有重寫equals方法,那么就會調用object默認的equals方法,是比較兩個對象的引用是不是相同,顯示這是兩個不同的對象,兩個對象的引用肯定是不定的。這里我們將生成的對象放到了HashSet中,而HashSet中只能夠存放唯一的對象,也就是相同的(適用于equals方法)的對象只會存放一個,但是這里實際上是兩個對象a,b都被放到了HashSet中,這樣HashSet就失去了他本身的意義了。
此時我們把equals方法給加上:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class HashTest {
  private int i;
 
  public int getI() {
    return i;
  }
 
  public void setI(int i) {
    this.i = i;
  }
 
  <span style="color:#3366FF;"><strong>public boolean equals(Object object) {
    if (object == null) {
      return false;
    }
    if (object == this) {
      return true;
    }
    if (!(object instanceof HashTest)) {
      return false;
    }
    HashTest other = (HashTest) object;
    if (other.getI() == this.getI()) {
      return true;
    }
    return false;
  }</strong></span>
 
  public int hashCode() {
    return i % 10;
  }
 
  public final static void main(String[] args) {
    HashTest a = new HashTest();
    HashTest b = new HashTest();
    a.setI(1);
    b.setI(1);
    Set<HashTest> set = new HashSet<HashTest>();
    set.add(a);
    set.add(b);
    System.out.println(a.hashCode() == b.hashCode());
    System.out.println(a.equals(b));
    System.out.println(set);
  }
}

此時得到的結果就會如下:

?
1
2
3
true
true
[com.ubs.sae.test.HashTest@1]

從結果我們可以看出,現在兩個對象就完全相等了,HashSet中也只存放了一份對象。

總結
1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用來在散列存儲結構中確定對象的存儲地址的;

2、如果兩個對象相同,就是適用于equals(java.lang.Object) 方法,那么這兩個對象的hashCode一定要相同;

3、如果對象的equals方法被重寫,那么對象的hashCode也盡量重寫,并且產生hashCode使用的對象,一定要和equals方法中使用的一致,否則就會違反上面提到的第2點;

4、兩個對象的hashCode相同,并不一定表示兩個對象就相同,也就是不一定適用于equals(java.lang.Object) 方法,只能夠說明這兩個對象在散列存儲結構中,如Hashtable,他們“存放在同一個籃子里”。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 视频一区在线免费观看 | 亚洲天堂网站 | 金莲你下面好紧夹得我好爽 | 大桥未久一区二区 | 果冻传媒在线播放1 | 俄罗斯引擎首页进入 | 国产精品成人在线播放 | jizzjizz3d动漫| 99热在线获取最新地址 | 欧美亚洲国产一区二区三区 | 亚洲精品资源在线 | 国产精品原创永久在线观看 | 45分钟做受片免费观看 | 大伊香蕉精品二区视频在线 | 2019中文字幕在线视频 | 999精品视频在线观看热6 | 美女模特被c免费视频 | 视频一区二区在线 | 国产亚洲福利精品一区 | 四虎黄色影视库 | 欧美日韩国产精品自在自线 | 高考录取率1977-2021 | 美女隐私部位视频网站 | 2022最新a精品视频在线观看 | 十六以下岁女子毛片免费 | 日本大乳护士的引诱图片 | 成人免费福利网站在线看 | 久久婷婷丁香五月色综合啪免费 | 鬼吹灯天星术在线高清观看 | ass极品美妇pic| 精品久久久久久亚洲 | 国产大秀视频 | 俄罗斯妈妈235 | 强制高h| 午夜dj免费视频观看社区 | 成年女人毛片免费观看中文w | 美女1819xxxx | 午夜人妻理论片天堂影院 | 精品一区二区三区视频日产 | 性啪啪chinese东北女人 | 精品国产线拍大陆久久尤物 |