2020-12-07

2020-12-07  本文已影响0人  范er_er

1.HashMap的底层数据结构?

数组长度是有限的,我们通过key.hashcode()得到的值有可能是相同的,则会形成链表

JDK1.7 数组+链表

public void node(){
    final K key;
    V value;
    final int hash;
     Entry<K,V> entry;
}

​ JDK1.8 数组+链表+红黑树

class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;
        }

2.HashMap的存取原理与HashMap是怎么处理hash碰撞的?

JDK1.7 entry链表插入方式 每次扩容的时候会将所有的entry值重新rehash 会出现环形链表,出现死循环

java8之前是头插法,就是说新来的值会取代原有的值,原有的值就顺推到链表中去,就像上面的例子一样,因为写这个代码的作者认为后来的值被查找的可能性更大一点,提升查找的效率。

JDK1.8 Node尾部插入了 在扩容时会保持链表元素原本的顺序,就不会出现链表成环的问题了。

3.hashmap为啥会线程不安全?有什么线程安全的类代替么?

4.默认初始化大小是多少?为啥是这么多?为啥大小都是2的幂?

5.HashMap的扩容方式?负载因子是多少?为什是这么多?

6.HashMap的主要参数都有哪些?

hashTable

ConcurrentHashMap

上一篇 下一篇

猜你喜欢

热点阅读