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来作存储的数据结构

猜你喜欢

转载自blog.csdn.net/u012309392/article/details/83446148
今日推荐