HashMap集合简介(重点)

HashMap集合简介

HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对。HashMap的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。

那么第一个问题来了
1.hashmap的底层数据结构 1.8之前和1.8的区别?
JDK1.8之前 HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决hash冲突(两个对象调用的hashCode方法计算的哈希码值一致导致计算的数组索引值相同)而存在的("拉链法"解决冲突)。

2.JDK1.8之后
相比于之前的版本,
JDK1.8之后 HashMap由数组+链表+红黑树组成的
JDK1.8之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。
在这里插入图片描述

第二个问题
2.hashmap存储元素的过程

在HashMap中,初始化数组长度为16。调用put方法存储元素时,传入key值及value值,此时将key值进行hash运算后的hash值作为该entry键值对在数组中的索引位置。此时确定该位置后,首先判断该位置是否为null,如果为null,则将entry存储在该位置,否则将entry以链表的方式存储在数组中。当链表长度大于8时,将链表转为红黑树继续存储entry。

3.hashMap 加载因子为什么0.75?
HashMap的底层是哈希表,是存储键值对的结构类型,
它需要通过一定的计算才可以确定数据在哈希表中的存储位置:
加载因子越大,填满的元素越多,空间利用率越高,但发生冲突的机会变大了;
加载因子就是表示Hash表中元素的填满程度。
加载因子 = 填入表中的元素个数 / 散列表的长度
加载因子越小,填满的元素越少,冲突发生的机会减小,但空间浪费了更多了
提高空间利用率和 减少查询成本的折中,主要是泊松分布,0.75的话碰撞最小。0.75就是折中之后的值
在这里插入图片描述
4.hashmap 为什么长度是2的n次方
HashMap为了存取高效,要尽量较少碰撞,就是要尽量把数据分配均匀,每个链表长度大致相同,这个实现就在把数据存到哪个链表中的算法。
这个算法实际就是取模,hash%length,
所以源码中做了优化。使用hash&(length-1),而实际上hash%length等于hash&(length-1)的前提是length是2的n次幂。
如果数组长度不是2的n次幂,计算出的索引特别容易相同,及其容易发生hash碰撞,导致其余数组空间很大程度上并没有存储数据,链表或红黑树过长,效率降低。
因此,HashMap容量为2次幂的原因,就是为了数据的均匀分布,减少hash冲突,毕竟hash冲突越大,代表数组中一个链的长度越大,这样的话会降低hashmap的性能。
在这里插入图片描述

5.为什么转换成红黑树的节点是8
理想情况下使用随机的哈希码,容器中节点分布在hash桶中的频率遵循泊松分布按照泊松分布的计算公式计算出了桶中元素个数和概率的对照表,可以看到链表中元素个数为8时的概率已经非常小,再多的就更少了,所以创作者在选择链表元素个数时选择了8,是根据概率统计而选择的。
而泊松分布的话博主也不是很懂 参照下图
在这里插入图片描述
6.hashmap的构造函数哪些?
HashMap提供了4个构造函数:
HashMap():构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。

public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR; // 将默认的加载因子0.75赋值给loadFactor,并没有创建数组
}

HashMap(int initialCapacity):构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。

public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR; // 将默认的加载因子0.75赋值给loadFactor,并没有创建数组
}

HashMap(int initialCapacity, float loadFactor):构造一个带指定初始容量和加载因子的空 HashMap。

public HashMap(Map<? extends K, ? extends V> m) {
    this.loadFactor = DEFAULT_LOAD_FACTOR;
    putMapEntries(m, false);
}

HashMap(Map<? extends K, ? extends V> m):传入一个map以构造一个新的map,使用默认加载因子(0.75)。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值