Java集合 HashMap基本介绍

1.HashMap概述

HashMap以键值对(key-value)为单位,存储在数组的数据结构中,在put()元素的时候,是根据hash算法计算hashCode,源码中使用 (n-1) & hash 计算存储下标

其中hash使用

key.hashCode()) ^ (h >>> 16

用原本计算出来的32位的hash二进制码 异或 hash码右移16位,使整个32位更充分被使用到,降低下标的重复性

当出现下标重复的时候,采用链表的形式对bucket(桶位)进行单向链表存储,最大长度为8

static final int TREEIFY_THRESHOLD = 8;  //hashMap源码中定义链表最大长度为8

当超过最大长度后,会转化为红黑树存储,若长度之后又小于6,则重新转化为链表存储

static final int UNTREEIFY_THRESHOLD = 6;  //hashMap源码中定义红黑树转化为链表的长度

数据结构可以用下图来表示

 

2.负载因子loadFactor以及容量capacity说明

1.容量(capacity)

HashMap默认capacity容量是2的4次方也就是16,最大容量是2的30次方

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16  //hashMap源码中默认初始容量
static final int MAXIMUM_CAPACITY = 1 << 30;  //hashMap源码中默认最大容量

2.负载因子(loadFactor)

HashMap默认的负载因子是0.75

static final float DEFAULT_LOAD_FACTOR = 0.75f;  //hashMap源码中默认负载因子

那么这个负载因子是干什么的呢?

通过对hashMap数据结构的了解,hashMap通过hashCode能够迅速的计算出存储下标,反之也可以快速取出该下标的Node节点,那么一个桶上只有一个元素性能是最好的,我们也知道下标的范围是(n-1)&hash所以范围是0到n-1之间,所以当桶中的元素增多时,重叠的概率就会慢慢增大,这时HashMap为了提升性能,设置了一个loadFactor负载因子,当容量达到容量(capacity)乘以负载因子(loadFactor)的时候,按默认初始大小是16 * 0.75 = 12 ,就会发生resize(),此时会将HashMap的容量提升两倍以提升性能

 

3.HashMap的注意事项

3.1 HashMap判断元素重复的依据

HashMap的Key——判断是否为同一个对象也是看 equals()和hashCode()

HashMap的value——判断是否为同一个对象只看 equals()

所以HashMap的存储的key元素重写equals()和hashCode()时一定要保证当hashCode相同时,equals也为true,也就是保持两者结果的一致性,不然会导致性能下降

3.2 HashMap的适用范围

轻负载的Set和Map适合插入和查找,但迭代较慢,如果是需要根据key来找value或者需要元素不重复又不需要每次都迭代遍历的话,尽量使用HashMap来作存储的数据结构

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值