get流程没有任何的锁,所以并发效率高

    1. public V get(Object key) {
    2. Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek;
    3. // spread 方法能确保返回结果是正整数
    4. int h = spread(key.hashCode());
    5. if ((tab = table) != null && (n = tab.length) > 0 &&
    6. (e = tabAt(tab, (n - 1) & h)) != null) {
    7. // 如果头结点已经是要查找的 key
    8. if ((eh = e.hash) == h) {
    9. if ((ek = e.key) == key || (ek != null && key.equals(ek)))
    10. return e.val;
    11. }
    12. // hash 为负数表示该 bin 正 在扩容中 或是 treebin, 这时调用 find 方法来查找
    13. else if (eh < 0)
    14. return (p = e.find(h, key)) != null ? p.val : null;
    15. // 正常遍历链表, 用 equals 比较
    16. while ((e = e.next) != null) {
    17. if (e.hash == h &&
    18. ((ek = e.key) == key || (ek != null && key.equals(ek))))
    19. return e.val;
    20. }
    21. }
    22. return null;
    23. }