当前位置: 首页 > news >正文

Java,数据结构与集合源码,关于Map接口的实现类(HashMap、LinkedHashMap)

HashMap中的元素的特点:

HashMap中的所有key之间是不可重复的、无序的。所有的key构成一个Set集合。
HashMap中的所有的value彼此之间是可重复的、无序的。所有的value构成一个Collection集合。
HashMap中的一对key-value,就构成了一个entry。Map中的entry是不可重复的、无序的。所有的entry就构成了一个Set集合。

HashMap的源码剖析:

jdk7:

HashMap < String , Integer > map = new HashMap<>(); //①
map.put("AA",78);//②
①:创建对象的过程中,底层会初始化数组,长度为16,即:Entry[ ] table = new Entry[16];
②:“AA”和78封装到一个Entry对象中,将此对象添加到table数组中。

添加的过程:

将(key1,value1)添加到当前map中:
首先,需要调用key1所在类的hashCode( )方法,计算key1对应的哈希值1,此哈希值1经过某种算法(hash( ))之后,得到哈希值2。
哈希值2再经过某种算法(indexFor( ))之后,就确定了其在数组table的索引位置i。
        ·如果此索引位置i的数组位置上没有元素,则(key1,value1)添加成功。——情况①
        ·如果此索引位置i的数组位置上有元素(若为key2),则需要继续比较key1和key2的哈希值2。-->哈希冲突。
                    ·如果key1的哈希值与key2的哈希值不相同,则(key1,value1)也添加成功。——情况②
· 如果key1的哈希值与key2的哈希值相同,则需要则需要继续判断key1和key2的equals( )的返回值。要调用key1所在类的equals( )方法,将key2作为参数传入。
                                    ·如果调用equals( )方法,返回false:则(key1,value1)添加成功。——情况③
                                    ·如果调用equals( )方法,返回true:则认为key1和key2是相同的。默认情况下,value1替换原有的value2.

添加成功的情况:

情况①:直接将(key1,value1)存放到数组的索引i的位置
情况②与情况③:(key1,value1)元素与现有的(key2,value2)构成单向链表结构,(key1,value1)指向(key2,value2),jdk7中即头插法。

如果满足以下情况,会扩容:

当元素的个数达到临界值(数组长度*加载因子)时,就考虑扩容。默认的加载因子为0.75。默认扩容后为原来的两倍。
如果put方法是添加操作,会返回null。如果put是修改操作,会返回原来位置上的value值。

jdk8中:

①在jdk8中,当创建了HashMap实例以后,底层并没有初始化table数组。当首次添加(key,value)时,进行判断,如果发现table尚未初始化,则对数组进行初始化。(懒汉式)
②在jdk8中,HashMap底层定义了Node内部类(实现了Entry接口),替换了jdk7中的Entry内部类。即创建的数组是Node[ ]。
③在jdk8中,出现哈希值冲突的情况,判断相应的(key,value)可以添加到指定发生哈希冲突的索引上,采用的是原来的元素指向新的元素,即尾插法。
④在jdk7中,底层采用的是数组+单向链表。在jdk8中,底层采用的是数组+单向链表+红黑树。
使用红黑树的情况(单向链表转换为红黑树):如果数组索引i上的元素的个数达到8,并且数组的长度达到64时,就将此索引i位置上的多个元素改为使用红黑树进行存储。(红黑树进行put( )/get( )/remove( )等操作的时间复杂度为O(log n)),比单向链表的复杂度O(n)的要更好,性能更高。
红黑树退化(单向链表转换为单向链表)的情况:当使用红黑树的索引i上的元素个数低于6时,就会将红黑树结构退化为单向链表。

LinkedHashMap与HashMap的关系:

LinkedHashMap是HashMap的子类。
LinkedHashMap在HashMap使用数组+单向链表+红黑树的基础上,增加了一对双向链表,记录添加(key,value)的先后顺序。便于遍历所有的key-value。

HashSet和LinkedHashSet:

Hash底层使用的是HashMap。
LinkedHashSet底层使用的是LinkedHashMap。
HashSet的元素的值存储在底层的HashMap的key值中,而所有的key值对应的value值都是同一个Object对象,HashSet里用不上其value值。LinkedHashSet同理。
http://www.lryc.cn/news/240367.html

相关文章:

  • 【GUI】-- 13 贪吃蛇小游戏之食物及成绩判断
  • 洗地机哪个牌子好用?洗地机选购攻略
  • 节能灯和led灯哪个更护眼?精选高品质的LED护眼台灯
  • 大数据管家 DataSophon 1.2介绍
  • vue实现爱心形状的复选框
  • 珠江啤酒坚持创新,“酿”造电子化采购平台
  • 数据仓库模式之详解 Inmon 和 Kimball
  • 斐波那契数列数列系列问题详解
  • Day38力扣打卡
  • 【C语言:深入理解指针二】
  • 前端实现表格生成序号001、002、003自增
  • 【Django-01】 视图函数和视图类
  • 编译安装报错:configure: error: cannot guess build type; you must specify one
  • 2311rust,到66版本更新
  • JOSEF约瑟 过电流继电器 JL15-300/11 触点形式一开一闭 板前接线
  • postman设置接口关联这样做,薪资直接涨3k
  • Java常见的bug
  • gitea仓库镜像同步至gitlab
  • 服务器不备案的影响
  • 5 个适用于 Linux 的开源日志监控和管理工具
  • 树莓派镜像安装 + 设置 + 镜像批量化操作 - 自动化烧写工具 (四)
  • Redis 性能管理 主从复制与哨兵模式
  • volatile 详解
  • Flink Operator 使用指南 之 Flink Operator安装
  • 类与对象(上篇)
  • 使用SpringBoot集成MyBatis对管理员的查询操作
  • 数据报文去哪儿了
  • Mysql中join on中的like使用
  • 微信运营神器:从群发到批量添加,让你的微信营销更轻松
  • 白杨SEO:2B企业营销是什么?当下主流的短视频直播平台有哪些?企业营销要做短视频直播选哪个平台更好?