HashMap详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap详解相关的知识,希望对你有一定的参考价值。

参考技术A (1)存储键值对,实现快速存取数据;
(2)允许键/值为null,但不允许重复的键;
(3)非同步synchronized(比同步快),线程不安全;
注:让HashMap同步: Map m = Collections.synchronizeMap(hashMap);
(4)实现Map接口,对键值对进行映射,不保证有序(比如插入的顺序)
注:Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。
(5)HashMap默认的容量大小是16;增加容量时,每次将容量变为“原始容量x2”
(6)HashMap添加元素时,是使用自定义的哈希算法;

(1)不存储键值对,仅存储对象;
(2)不允许键/值为null;
(3)线程安全(速度慢),采用synchronize关键字加锁原理(几乎在每个方法上都加锁),;
(4)实现了Set接口,不允许集合中有重复的值。注:将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,
比较对象的值是否相等,以确保set中没有储存相等的对象。hashCode()可能相同,用equals()判断对象的相等性。
(5)Hashtable默认的容量大小是11;增加容量时,每次将容量变为“原始容量x2 + 1”;
(6)Hashtable没有自定义哈希算法,而直接采用的key的hashCode()。

(1)Java并发包java.util.concurrent中的一个线程安全且高效的HashMap实现
(2)不允许键/值为null;
(3)线程安全:在JDK1.7中采用“分段锁”的方式,1.8中直接采用了CAS(无锁算法)+ synchronized。

Entry:HashMap是一个用于存储Key-Value键值对的集合,每一个键值对叫做Entry,这些Entry分散存储在一个数组当中。
hashMap是在bucket中储存键对象和值对象,作为Map.Entry
bucket:HashMap初始化时,创建一个长度为capacity的Entry数组,这个数组里可以存储元素的位置被称为“桶(bucket)”,
每个bucket都有其指定索引,系统可以根据其索引快速访问该bucket里存储的元素。
loadFactor:负载因子。默认值DEFAULT_LOAD_FACTOR = 0.75f;
capacity:容量,指的是数组的长度
threshold:阈值=capacity*loadFactor。超过阈值则扩容为原来的两倍。
size:HashMap的大小,它是HashMap保存的键值对的数量。

HashMap是基于hashing的原理,底层使用哈希表结构(数组+链表)实现。使用put(key,value)存储对象,使用get(key)获取对象。
理解为,数组中存储的是一个Entry,并且作为链表头结点,头结点之后的每个节点中储存键值对对象Entry。

给put()方法传递键和值时,先对键调用hashCode()方法计算hash从而得到bucket位置,进一步存储,
HashMap会根据当前bucket的占用情况自动调整容量(超过负载因子Load Facotr则resize为原来的2倍)。
扩容扩的是数组的容量,发生碰撞后当链表长度到达8后,链表上升为红黑树,提高速度。

根据键key的hashcode找到bucket位置,然后遍历链表节点,调用equals(用来获取值对象)方法确定键值对,找到要找的值对象。

a.对key的hashCode做hash操作(高16bit不变,低16bit和高16bit做了一个异或)
b.计算下标(n-1) & hash,从而获得buckets的位置 //h & (length-1)

数字分析法、平方取中法、分段叠加法、 除留余数法、 伪随机数法。

其他解决hash冲突办法:开放定址法、链地址法、再哈希法。

根据hashcode来划分的数组,如果数组的坐标相同,则进入链表这个数据结构中,jdk1.7及以前为头插法,jdk1.8之后是尾插法,
在jdk1.8之后,当链表长度到达8的时候,jdk1.8上升为红黑树。存的时候按照上面的方式存,取的时候根据equals确定值对象。

1.常见问题:集合类、数据结构、线程安全、解决碰撞方法、hashing概念和方法、equals()和hashCode()的应用、不可变对象的好处

https://blog.csdn.net/weixin_42636552/article/details/82016183
https://blog.csdn.net/u012512634/article/details/72735183
https://blog.csdn.net/zaimeiyeshicengjing/article/details/81589953
https://blog.csdn.net/aura521521/article/details/78462459

以上是关于HashMap详解的主要内容,如果未能解决你的问题,请参考以下文章

Java中HashMap详解

Java中HashMap详解

HashMap结构详解

HashMap详解

HashMap原理详解

java中HashMap详解