HashMap源代碼分析

1.HashMap簡介

  • HashMap繼承了AbstractMap類該類實現了Map接口,HashMap同時實現了Map接口。
  • HashMap是key,value結構的鍵值對,支持key和value都為null
  • HashMap和HashTable功能很相近,可以把它看做非線程安全的HashTable和允許key,value為空。

2.分析下HashMap的內部結構

hashmap結構圖.png

HashMap有兩個重要的參數:一個是加載因子,另一個是初始容量

//初始容量為16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
//默認加載因子是0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;

3.HashMap的構造函數

//設置初始容量和加載因子
public HashMap(int initialCapacity, float loadFactor)
//設置初始容量和默認加載因子
public HashMap(int initialCapacity)
//默認構造,使用默認容量和默認加載引起
public HashMap()
//使用已經存在的map創建新的map
public HashMap(Map<? extends K, ? extends V> m)

4.HashMap主要對外接口
4.1 get方法

public V get(Object key) {
        //如果key是null的話
        if (key == null)
            return getForNullKey();
        //key不為空調用getEntry方法
        Entry<K,V> entry = getEntry(key);
        return null == entry ? null : entry.getValue();
    }

private V getForNullKey() {
        //判斷大小
        if (size == 0) {
            return null;
        }
        //null存在table[0]上,返回value的值
        for (Entry<K,V> e = table[0]; e != null; e = e.next) {
            if (e.key == null)
                return e.value;
        }
        return null;
    }

final Entry<K,V> getEntry(Object key) {
        //如果map的size為0,那么就直接返回null
        if (size == 0) {
            return null;
        }
        //計算hash值
        int hash = (key == null) ? 0 : hash(key);
        //獲取到hash值對應的table中的鏈表
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            //遍歷該鏈表,判斷key是否相等
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }

5.HashMap存儲數據是無序的我們看下代碼的例子

HashMap<String,Integer>  store = new HashMap<String,Integer>();
        store.put("22", 33);
        store.put("44", 44);
        store.put("55", 55);
        for(Map.Entry<String,Integer> ele :store.entrySet()) {
            System.out.println(ele.getKey() + "--" + ele.getValue());
        }

運行結果如下:

44--44
55--55
22--33
說明并不是按照我們存儲的順序存儲的。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、基本數據類型 注釋 單行注釋:// 區域注釋:/* */ 文檔注釋:/** */ 數值 對于byte類型而言...
    龍貓小爺閱讀 4,290評論 0 16
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,525評論 0 3
  • HashMap 是 Java 面試必考的知識點,面試官從這個小知識點就可以了解我們對 Java 基礎的掌握程度。網...
    野狗子嗷嗷嗷閱讀 6,706評論 9 107
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • 失眠小姐決定去上海的那個黃昏,留了一張便條即匆匆離開,害怕與熟人打照面,害怕被詢問去處。慌張的似個新手小偷。失眠小...
    閑人張閱讀 485評論 1 6