hashMap是什么?
基于哈希表的 Map 接口的实现,提供所有可选的映射操作,并允许使用 null 值和 null 键
hashMap在JDK1.8前后区别:
1.JDK1.8之前:
HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决hash冲突而存在的("拉链法"解决冲突)。
2.JDK1.8之后:
加入了红黑树,底层由数组+链表+红黑树组成。会在链表长度过长时转化为红黑树来存储数据,将链表转换为红黑树前会判断,即使阈值大于8,但是数组长度小于64,此时并不会将链表转换为红黑树。而是选择进行数组扩容(2倍)。
2.hashmap存储元素的过程
hashmap存储元素的过程
根据hash运算后的key得出hash值判断位置,如果位置为null,就直接放入数组,如果不为null,则生成链表存入
,当链表长度超过八位时,就转换为红黑树继续存储数据
hashMap 加载因子为什么0.75?
加载因子过高,例如为1,虽然减少了空间开销,提高了空间利用率,但同时也增加了查询时间成本
加载因子过低,例如0.5,虽然可以减少查询时间成本,但是空间利用率很低,同时提高了rehash操作的次数
hashmap 为什么长度是2的n次方
如果数组长度不是2的n次幂,计算出的索引特别容易相同,及其容易发生hash碰撞,
导致其余数组空间很大程度上并没有存储数据,链表或红黑树过长,效率降低。
为什么转换成红黑树的节点是8
当桶中元素到达8个的时候,概率已经变得非常小,
也就是说用0.75作为加载因子,每个碰撞位置的链表长度超过8个是几乎不可能的
hashmap的构造函数哪些?
有四个分别为:
- public HashMap(int initialCapacity, float loadFactor)
- public HashMap(int initialCapacity)
- public HashMap()
- public HashMap(Map<? extends K, ? extends V> m)
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
public HashMap(Map<? extends K, ? extends V> m) {
this.loadFactor = DEFAULT_LOAD_FACTOR;
putMapEntries(m, false);
}
本文深入介绍了HashMap,它是基于哈希表的Map接口实现,允许null值和null键。阐述了JDK1.8前后的区别,包括底层结构变化;说明了存储元素过程、加载因子设为0.75的原因、长度为2的n次方的意义,以及转换红黑树节点为8的缘由,还列举了构造函数。

377

被折叠的 条评论
为什么被折叠?



