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.

 

posted @ 2021-01-26 13:33  默不言  阅读(1514)  评论(0)    收藏  举报