HashMap的底层原理
HashMap的底层原理
(1)基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。
HashMap底层是一个Entry数组,当存放数据时会根据hash算法计算数据的存放位置。算法:hash(key)%n,n就是数组的长度。
当计算的位置没有数据时,就直接存放,当计算的位置有数据时也就是发生hash冲突的时候/hash碰撞时,采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。
(2)底层是基于数组+链表的形式进行存储,当存储一个键值对时,先对key值进行hash运算,找到对应的下标位置进行存储,当该位置有数据时,则会出现hash碰撞问题,此时需判断key值是否相同。如果相同,则value被覆盖,如果不同,则以链表的形式进行存储。
jdk1.8以后,当链表长度达到8的时候,则变为红黑树进行存储,当红黑树节点降为6的时候,则又重新变成链表存储。而且1.8以后的链表存储方式有原来的头插法变成尾插法。hashmap的初始容量16,加载因子0.75,当map的容量达到原始容量的0.75倍之后,容量会进行2倍扩容,扩容之后原来的数据会进行hash存储。
(3)hashmap是不是线程安全的?
hashmap是非线程安全的,使用HashTable,ConcurrentHashMap.
                    
                
                
            
        
浙公网安备 33010602011771号