HashMap原理

HashMap采用数组+链表/红黑树实现,通过拉链法解决碰撞。初始容量16,负载因子0.75,当元素数量达到容量的75%时扩容。当链表长度达到8,转为红黑树。JDK1.8中,优化了hash算法,增加了红黑树以提高性能。在并发环境下可能导致死循环或元素丢失,适合使用线程安全的ConcurrentHashMap。
摘要由CSDN通过智能技术生成

HashMap原理

HashMap采用Entry数组来存储Key-Value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向链表结构,它具有Next指针,可以连接下一个Entry实体。只是在JDK1.8中,链表长度大于8的时候,链表会转为红黑树!
HashMap底层数据存储结构
1)先来认识一下HashMap中定义的一些需要了解的成员变量
//hashMap数组的初始容量是16

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;

//负载因子0.75f

static final float DEFAULT_LOAD_FACTOR = 0.75f;

//树形化阈值8

static final int TREEIFY_THRESHOLD = 8;

//解除树形化阈值6

static final int UNTREEIFY_THRESHOLD = 6;

//树形化的另一条件:Map数组的长度阈值64

static final int MIN_TREEIFY_CAPACITY = 64

//这个就是hashMap的内部数组了,而Node则是链表节点对象。

transient Node<K,V>[] table;

//数组扩容阈值

int threshold;

initialCapacity数组的初始化容量为16。可以在构造方法中指定,必须是2的幂次方(16—>32—>64…)
loadFactor加载因子0.75f。所谓加载因子就是HashMap的容量达到0.75时的时候会试试扩容resize();

例如:

假设有一个HashMap的初始容量为16,那么扩容的阈值就是0.75*16=12,也就是说,在你打算存入第13个值的时候,HashMap就会先执行扩容。加载因子也是能通过构造方法中指定,如果指定大于1,则数组不会扩容,牺牲了性能不过提升了内存。

TREEIFY_THRESHOLD 树形化阈值。当链表的节点个数大于等于这个值时,会将链表转化
为红黑树。

UNTREEIFY_THRESHOLD 解除树形化阈值。当链表的节点个数小于等于这个值时,会将
红黑树转换成普通的链表。

MIN_TREEIFY_CAPACITY树形化阈值的第二条件。当数组的长度小于这个值时,就算树形
化阈达标,链表也不会转化为红黑树,而是优先扩容数组resize()。
threshold 数组扩容阈值。即:HashMap数组总容量 * 加载因子。当前容量大于或等于该
值时会执行扩容resize()。扩容的容量为当前 HashMap 总容量的两倍。比如,当前
HashMap 的总容量为 16 ,那么扩容之后为 32 。

2)继承关系
//table内部数组是节点类型

static class Node<K,V> implements Map.Entry<K,V> {
   
final int hash;
final K key;
V value;
Node<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值