JDK1.8,Java,HashMap的put()方法全过程(超详细)

首先一个节点进来做hash值并取余运算,hash到对应的桶,开有没有hash冲突,如果没有直接插入,如果有就需要遍历链表,看有没有key相同的情况,如果有就进行值的替换,如果没有就插到链表尾部(哪些判断是否变为红黑树逻辑在下面进行解析,这里做个大概描述)

1.7使用头插法,因为他认为先最近插入的最容易被访问,但是在并发,扩容数组的时候可能会出现死循环。因为并发扩容reHash一张新的表。扩容的时候会出现两个数组。使用头插法,且插入时不是原子性的,因此可能会出现死循环。

因此1.8又变为了尾插法

初始容量为16,只不过是懒加载

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
复制代码

使用内部类Node数组

static class Node implements Map.Entry {
        final int hash;
        final K key;
        V value;
        Node next;

        Node(int hash, K key, V value, Node next) {
            this.hash = hash;
            this.key = key;
            this.value = value;
            this.next = next;
        }
复制代码

Node数组组成的Hash表

transient Node[] table;
复制代码

你可能感兴趣的:(哈希算法,java,数据结构)