HashMap扩容机制
将(K1V1)直接放入 Node类型的数组中, 这个数组初始化容量是16,默认的加载因子是0.75,也就是当元素加到12的时候,底层会进行扩容, 扩容为原来的2倍
可能引发的问题:
HashMap实际使用过程中会出现一些线程安全问题,在JDK1.7中,当并发执行扩容操作时会造成环形链和数据丢失的情况,开多个线程不断进行put操作,rehash的时候,日链表迁移新链表的时候如果在新表的数组索引位置相同,则链表元索会倒置(就是因为头插) 所以最后的结果打乱了插入的顺序,就可能发生环形链和数据丢失的问题,引起死循环,导致CPU利用率接近100%。在dk18中对HashMap进行了优化,发生hash碰撞 不再采用头插法方式,而是直接插入链表尾部,因此不会出现环形链表的情况,但是在多线程环境下 会发生数据覆盖的情况,如果没有hash碰撞的时候,它会直接插入元素。如果线程A和线程B同时进行put操作,刚好这两条不同的数据hash值一样,并且该位置数据为null,线程A进入后还未进行数据插入时挂起,而线程B正常执行,从而正常插入数据,然后线程A获取CPU时间片,此时线程A不用再进行hash半I断了,生程A会把线程B插入的数据给覆盖, 二致
数据发生覆盖的情况, 发生线程不安全。