栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

HashMap的底层存储结构和原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

HashMap的底层存储结构和原理

Map接口下的结构:


Map: 双列数据,存储key - value键值对。

HashMap: 是Map的主要实现类,可以存储null的key和value;线程不安全,效率高。

TreeMap:底层使用红黑树,按添加的key - value对进行排序,所以实现Comparable接口或者重写Compartor的compare()方法。

Hashtable: Map的古老实现类,不能存储null的key - value,线程不安全,现在基本不用。

LinkedHashMap: HashMap的子类,可以按照添加的顺序遍历,因为在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。对于频繁的遍历操作,此类执行效率高于HashMap。

Properties:常用来处理配置文件。key-value都是String类型。

在jdk8中HashMap是如何存储数据的:
在HashMap中,数据仍然是以数组存放的。在jdk8中,key - value存储单元是Node。

HashMap map = new HashMap();
map.put(key1,value1);

在实例化HashMap(HashMap map = new HashMap())后,底层数组并没有被创建。当我们调用put()方法往里面存数据的时候,底层会创建一个长度为16的数组。
一、调用key1所在类的hashCode()计算key1的哈希值,此哈希值经过某种算法计算后,得到在Node[]数组中的存放位置。
(1)如果此位置没有数据,则数据添加成功。
(2)如果此位置有一个或多个以链表形式存储数据:比较key1和此位置所有数据的哈希值。
①如果key1的哈希值与这个位置上的数据的哈希值都不相同,则key1这对数据添加成功。
②如果key1的哈希值与此位置上的数据有相同的(如key2 - value2):调用key1所在类的equals()方法比较。
Ⅰ如果equals()返回false,则key1这对数据添加成功。
Ⅱ如果equals()返回true,则使用vaule1替换vaule2。

注:同一个位置如果有多个数据,则这些数据是以链表形式存储的,当数组长度 > 64并且单个位置以链表形式存储的数据超过8个时,此位置的数据转化为红黑树的形式存储。 何时扩容:负载因子=0.75时,当 数组容量/数组长度 = 0.75 时,扩容为原来的2倍。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/838093.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号