最近在看一些關於Java源碼的東西,理解其中的奧妙,今天看到關於Map中put方法,雖然不是特別瞭解,可是畢竟有點心得體會,拿出來記錄一下。數組
關於Map中put的存儲過程大概是,使用map.put之後,編譯器會根據k來獲取hash值,而後調用一個方法,把其中的內容放入到一個節點,而後用數組的形式來獲取節點。app
main(String[] args){ HashMap<String,String> map=HashMap<>(); map.put(,); map.put(,); map.put(,); map.toString(); System..println(map); }
這一部分是個人測試用例。測試
hash(Object key) { h; (key == ) ? : (h = key.hashCode()) ^ (h >>> ); }
調用map後,根據key來獲取到其中的hash,其中hash值獲取是把其中的key變成char型,經過for循環遍歷獲取到,最後返回到。ui
put(key, value) { putVal((key), key, value, , ); }
在記錄了hash值和key,value之後,調用code
putVal(hash, key, value, onlyIfAbsent, ) { Node<,>[] tab; Node<,> p; n, i; ((tab = ) == || (n = tab.) == ) n = (tab = resize()).; ((p = tab[i = (n - ) & hash]) == ) tab[i] = newNode(hash, key, value, ); { Node<,> e; k; (p.== hash && ((k = p.) == key || (key != && key.equals(k)))) e = p; (p TreeNode) e = ((TreeNode<,>)p).putTreeVal(, tab, hash, key, value); { (binCount = ; ; ++binCount) { ((e = p.) == ) { p.= newNode(hash, key, value, ); (binCount >= - ) treeifyBin(tab, hash); ; } (e.== hash && ((k = e.) == key || (key != && key.equals(k)))) ; p = e; } } (e != ) { oldValue = e.; (!onlyIfAbsent || oldValue == ) e.= value; afterNodeAccess(e); oldValue; } } ++; (++> ) resize(); afterNodeInsertion(); ; }
首先建立一個Node輸入四個參數,hash,key,value還有nextNode四個參數,而後經過判斷添加到tab[i]裏面。get
最後輸出時候用toString()方法遍歷編譯器
String toString() { Iterator<Entry<,>> i = entrySet().iterator(); (! i.hasNext()) ; StringBuilder sb = StringBuilder(); sb.append(); (;;) { Entry<,> = i.next(); key = .getKey(); value = .getValue(); sb.append(key == ? : key); sb.append(); sb.append(value == ? : value); (! i.hasNext()) sb.append().toString(); sb.append().append(); } }
最後用StringBuilder拼接。
源碼