1. 程式人生 > >java 中HashMap解決hash衝突問題

java 中HashMap解決hash衝突問題

摘至 jdk1.6 HashMap的原始碼:

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) { // 查詢hash位置上的值
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { //  如果找到key相同的值,則更小value,說明之前儲存了key

                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
        // 執行到這步,說明以前沒有儲存key值,下面需要存在這個新的key值
        modCount++; // HashMap 不是執行緒安全,當hashnext時會判斷modCount的值是否變化了,變化了說明查詢的時候,有另外的執行緒更新了HashMap

        addEntry(hash, key, value, i); // 儲存新的key值
        return null;

    }

// 在這個方法裡面解決了hashcode衝突的問題,Entry 是一個連結串列,沒有衝突那麼Entry只有一個記錄,如果有衝突Entry中會有多個記錄

// 查詢到記錄時,還是比較key值是否相同

void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex]; // 沒有衝突 則 e為空,有衝突則把原來的物件放在e的next地址上。


        table[bucketIndex] = new Entry<K,V>(hash, key, value, e); 
        if (size++ >= threshold)
            resize(2 * table.length);
    }

Entry(int h, K k, V v, Entry<K,V> n) {
            value = v;
            next = n;
            key = k;
            hash = h;
   }

public V get(Object key) {
        if (key == null)
            return getForNullKey();
        int hash = hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) // 查詢時,通過hash得到Entry後,還需要比較Entry的key值是否相同,相同則找到了所要的記錄。
                return e.value;
        }
        return null;
    }

相關推薦

java HashMap解決hash衝突問題

摘至 jdk1.6 HashMap的原始碼: public V put(K key, V value) {         if (key == null)             return putForNullKey(value);         int hash

java基礎--HashMap解決hash衝突的方法

在Java程式語言中,最基本的結構就是兩種,一種是陣列,一種是模擬指標(引用),所有的資料結構都可以用這兩個基本結構構造,HashMap也一樣。當程式試圖將多個 key-value 放入 HashMap

演算法---hash演算法原理(javaHashMap底層實現原理和原始碼解析)

散列表(Hash table,也叫雜湊表),是依據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。  比如我們要儲存八十八個資料,我們為他申請了100個

Java解決hash衝突的辦法

Hash衝突   解決辦法 開放定址法(線性探測再雜湊,二次探測再雜湊,偽隨機探測再雜湊) 再雜湊法 鏈地址法 建立一個公共溢位區 Note: Java中HashMap採用的是 鏈地址法 Reference

JavaHashMap底層實現原理(JDK1.8)源碼分析

blank imp dash logs || 屬性 lte das ces 這幾天學習了HashMap的底層實現,但是發現好幾個版本的,代碼不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一樣,原來他們沒有指定JDK版本,很多文章都是舊版本J

Java HashMap 初始化時賦值

lec SM 解決 道理 test ack 增加 數據結構 解決辦法 1、HashMap 初始化的文藝寫法HashMap 是一種常用的數據結構,一般用來做數據字典或者 Hash 查找的容器。普通青年一般會這麽初始化:HashMap<String, S

javaHashMap集合的常用方法

tps one style 副本 .html map cnblogs inf clone public Object clone() 返回hashMap集合的副本 其余的方法都是實現Map集合的 https://www.cnblogs.com/xiaostudy/

cmd如何解決衝突問題

一、 檢視所有程序佔用的埠在開始-執行-cmd,輸入:netstat –ano可以檢視所有程序   二、檢視佔用指定埠的程式當你在用tomcat釋出程式時,經常會遇到埠被佔用的情況,我們想知道是哪個程式或程序佔用了埠,可以用該命令: netstat -ano|findstr "8080"1

JavaHashMap底層資料結構

HashMap也是我們使用非常多的Collection,它是基於雜湊表的 Map 介面的實現,以key-value的形式存在。在HashMap中,key-value總是會當做一個整體來處理,系統會根據hash演算法來來計算key-value的儲存位置,我們總是可以通過key快速地存、取value。下

解決Hash衝突四種方法

一)雜湊表簡介   非雜湊表的特點:關鍵字在表中的位置和它之間不存在一個確定的關係,查詢的過程為給定值一次和各個關鍵字進行比較,查詢的效率取決於和給定值進行比較的次數。     雜湊表的特點:關鍵字在表中位置和它之間存在一種確定的關係。 雜湊函式:一般情

javaHashMap、CurrentHashMap 工作原理&&和HashTable、HashSet的區別

HashMap和HashTable的區別 HashMap儲存的是鍵值對(接受null鍵值對),不支援synchronized,速度很快; HashTable不接受null鍵值對,可同步(Synchronized) 雖然HashMap是非Synchronized,但collection

JAVAHashMap相關知識的總結(一)

Java中HashMap在jdk1.7和jdk1.8中的區別點: 在jdk1.7中是用陣列+連結串列形式儲存,1.8採用陣列+連結串列/紅黑樹形式 Jdk1.8中由連結串列轉為紅黑樹是長度大於8,由紅黑樹轉為連結串列是節點數小於6。         &

JavaHashMap實現1對N

              我們都知道在Java中的HashMap預設的是1對1,但其實可以處理一下讓他適合1對來儲存資料,其實也就是對鍵值對中得值的資料進行及時的更新.我們實現這一操作作用到了分揀儲存;   &nb

JavaHashMap和TreeMap的區別

  首先介紹一下什麼是Map。在陣列中我們是通過陣列下標來對其內容索引的,而在Map中我們通過物件來對物件進行索引,用來索引的物件叫做key,其對應的物件叫做value。這就是我們平時說的鍵值對。 HashMap通過hashcode對其內容進行快速查詢,而 TreeMap中所有的元

java HashMap 與HashTable之間的區別

今天訪問java 併發程式設計網,看到一個翻譯徵集令,併發程式設計網的作者從stackoverflow 網站上選取了一些經典問答,遂決定翻譯幾篇 翻譯系列文章: 3.在java中如何建立一個記憶體洩露 譯文: 問題:   java 中HashMap 與Hash

java正確解決使用者退出

正確解決使用者退出問題注:本文是翻譯的javaworld.com上的一篇名為《Solving the logout problem properly and elegantly》的文章,原文請參看Solving the logout problem properly an

JavaHashMap底層實現原理(JDK1.8)原始碼分析

在JDK1.6,JDK1.7中,HashMap採用位桶+連結串列實現,即使用連結串列處理衝突,同一hash值的連結串列都儲存在一個連結串列裡。但是當位於一個桶中的元素較多,即hash值相等的元素較多時,通過key值依次查詢的效率較低。而JDK1.8中,HashMap採用位桶+

理解JavaHashMap的工作原理

Java中的HashMap使用雜湊來高效的查詢和儲存值。HashMap內部使用Map.Entry的形式來儲存key和value, 使用put(key,value)方法儲存值,使用get(key)方法查詢值。 理解hashCode() Java中的hashCode()

解決hash衝突的四種方法

通過構造效能良好的雜湊函式,可以減少衝突,但一般不可能完全避免衝突,因此解決衝突是雜湊法的另一個關鍵問題。建立雜湊表和查詢雜湊表都會遇到衝突,兩種情況下解決衝突的方法應該一致。下面以建立雜湊表為例,說明解決衝突的方法。常用的解決衝突方法有以下四種: 一、開

(轉載)JavaHashMap底層實現原理(JDK1.8)原始碼分析

近期在看一些java底層的東西,看到一篇分析hashMap不錯的文章,跟大家分享一下。 在JDK1.6,JDK1.7中,HashMap採用位桶+連結串列實現,即使用連結串列處理衝突,同一hash值的連結串列都儲存在一個連結串列裡。但是當位於一個桶中的元素較多,即hash值