最近在看一些关于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拼接。
源码