<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    淺談Java中的hashcode方法

     哈希表這個數據結構想必大多數人都不陌生,而且在很多地方都會利用到hash表來提高查找效率。在Java的Object類中有一個方法:
      public native int hashCode();
      根據這個方法的聲明可知,該方法返回一個int類型的數值,并且是本地方法,因此在Object類中并沒有給出具體的實現。
      為何Object類需要這樣一個方法?它有什么作用呢?今天我們就來具體探討一下hashCode方法。
      一.hashCode方法的作用
      對于包含容器類型的程序設計語言來說,基本上都會涉及到hashCode。在Java中也一樣,hashCode方法的主要作用是為了配合基于散列的集合一起正常運行,這樣的散列集合包括HashSet、HashMap以及HashTable。
      為什么這么說呢?考慮一種情況,當向集合中插入對象時,如何判別在集合中是否已經存在該對象了?(注意:集合中不允許重復的元素存在)
      也許大多數人都會想到調用equals方法來逐個進行比較,這個方法確實可行。但是如果集合中已經存在一萬條數據或者更多的數據,如果采用equals方法去逐一比較,效率必然是一個問題。此時hashCode方法的作用就體現出來了,當集合要添加新的對象時,先調用這個對象的hashCode方法,得到對應的hashcode值,實際上在HashMap的具體實現中會用一個table保存已經存進去的對象的hashcode值,如果table中沒有該hashcode值,它就可以直接存進去,不用再進行任何比較了;如果存在該hashcode值, 就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址,所以這里存在一個沖突解決的問題,這樣一來實際調用equals方法的次數就大大降低了,說通俗一點:Java中的hashCode方法就是根據一定的規則將與對象相關的信息(比如對象的存儲地址,對象的字段等)映射成一個數值,這個數值稱作為散列值。下面這段代碼是java.util.HashMap的中put方法的具體實現:
    public V put(K key, V value) {
    if (key == null)
    return putForNullKey(value);
    int hash = hash(key.hashCode());
    int i = indexFor(hash, table.length);
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
    Object k;
    if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
    V oldValue = e.value;
    e.value = value;
    e.recordAccess(this);
    return oldValue;
    }
    }
    modCount++;
    addEntry(hash, key, value, i);
    return null;
    }
      put方法是用來向HashMap中添加新的元素,從put方法的具體實現可知,會先調用hashCode方法得到該元素的hashCode值,然后查看table中是否存在該hashCode值,如果存在則調用equals方法重新確定是否存在該元素,如果存在,則更新value值,否則將新的元素添加到HashMap中。從這里可以看出,hashCode方法的存在是為了減少equals方法的調用次數,從而提高程序效率。
      有些朋友誤以為默認情況下,hashCode返回的就是對象的存儲地址,事實上這種看法是不全面的,確實有些JVM在實現時是直接返回對象的存儲地址,但是大多時候并不是這樣。
      因此有人會說,可以直接根據hashcode值判斷兩個對象是否相等嗎?肯定是不可以的,因為不同的對象可能會生成相同的hashcode值。雖然不能根據hashcode值判斷兩個對象是否相等,但是可以直接根據hashcode值判斷兩個對象不等,如果兩個對象的hashcode值不等,則必定是兩個不同的對象。如果要判斷兩個對象是否真正相等,必須通過equals方法。
      也就是說對于兩個對象,如果調用equals方法得到的結果為true,則兩個對象的hashcode值必定相等;
      如果equals方法得到的結果為false,則兩個對象的hashcode值不一定不同;
      如果兩個對象的hashcode值不等,則equals方法得到的結果必定為false;
      如果兩個對象的hashcode值相等,則equals方法得到的結果未知。

    posted on 2014-05-29 11:36 順其自然EVO 閱讀(145) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2014年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 成全视频在线观看免费高清动漫视频下载 | 久久久久久久久久国产精品免费| 亚洲自偷自偷在线成人网站传媒 | 免费精品久久天干天干| 亚洲AV成人一区二区三区观看 | 视频一区二区三区免费观看| 亚洲伦理一二三四| 亚洲人成网77777亚洲色| 免费日本黄色网址| 成人毛片手机版免费看| 久草视频免费在线| 久久久久久AV无码免费网站下载| 又硬又粗又长又爽免费看 | 免费能直接在线观看黄的视频| 久久www免费人成精品香蕉| 亚洲高清乱码午夜电影网| 亚洲综合久久一本伊伊区| 亚洲视频在线一区| 亚洲av无码不卡一区二区三区| 亚洲中文字幕无码中文字在线 | 国产成人1024精品免费| 香港一级毛片免费看| 亚洲国产成人精品无码区二本 | 天天操夜夜操免费视频| 久久天天躁狠狠躁夜夜免费观看| 亚洲精品免费在线视频| 最近中文字幕免费完整| 99re视频精品全部免费| 91福利视频免费| 8x8×在线永久免费视频| 99精品一区二区免费视频| 一级毛片免费播放| 在线观看免费视频资源| 久久午夜免费视频| 四虎影视www四虎免费| 四虎成人免费网址在线| 国产午夜影视大全免费观看| 免费少妇a级毛片| 国产亚洲精品a在线观看 | 91精品国产免费| 久久经典免费视频|