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

双列集合——HashMap,LinkedHashMap,TreeMap基本介绍

HashMap

不需要学习额外的新的方法,直接使用map接口里的方法就可以了。
只要学习一下hashmap本身的一些特点就可以了。
在这里插入图片描述

特点

在这里插入图片描述

hash表底层:

数组+链表,jdk8时为了提高性能又在里面加上了红黑树。
当创建了一个hashmap对象的时候,底层首先还是会创建一个长度为16,默认加载因子为0.75的数组,再利用put方法就可以添加数据了。
put方法底层首先会创建一个entry对象,entry对象里面记录的就是要添加的键和值,然后利用键计算出键的hash值,只要键的hash值就可以了,再计算出在数组中应存入的索引,如果该位置值为null, 直接就添加进去了。
在这里插入图片描述
在这里插入图片描述
如果位置不为null,调用equals方法比较键的属性值。如果键的数据一样,就会覆盖原有的entry对象;如果不一样,就会添加新的entry对象:
jdk8以前,新元素会添加到数组中,原先的挂在下面形成一条链表。
在这里插入图片描述
jdk8以后,新的直接挂在下面形成一条链表:
在这里插入图片描述
并且为了提高性能,链表的长度超过8且数组长度>=64时,链表自动转成红黑树:
在这里插入图片描述

总结

在这里插入图片描述

hashmap练习一:存储自定义对象

hashmap练习二:利用map集合进行统计

LinkedHashMap

辈分比较低,他爹是hashmap。
所以同样不需要额外学习方法,直接用map接口里的就可以。
在这里插入图片描述

特点

同样都是由键决定的,跟值没有任何关系。
在这里插入图片描述

实现:

四个元素怎么存到hash表中,又怎么保证存和取的顺序的:
在这里插入图片描述
添加元素时候和他爹一样,同样会调用hashcode方法,计算出键的hash值,再计算出在数组中应存入的位置,如果说该位置是有元素的,就使用equals方法去比较键是否相同,如果该位置是没有元素的,就直接添加进去。同时在底层多了一条双向链表,链表头节点就是刚刚添加的第一个元素。
在这里插入图片描述
添加第二个元素:
当把第二个元素按照上面添加成功后,第一个元素内会记录第二个元素的地址值,第二个元素也会记录第一个元素的地址值,这样就形成了双向链表。
在这里插入图片描述
添加第三个元素:
通过上面流程,计算出应该存入索引是3,但是这里已经有元素了,就会通过equals方法比较键的属性值是否相同,相同就覆盖,不相同:在jdk8以后就会挂在下面,与此同时,第二个元素和第三个元素直接还要再互相记录地址值,现在在双向链表中就已经把这三个元素按照添加的顺序连在一起了。
在这里插入图片描述
添加第四个元素:
第三个元素和第四个元素之间也会互相记录一次地址值。四个元素添加完,双向链表的头节点就是添加的第一个元素,尾节点就是添加的最后一个元素。
遍历的时候就是从双向链表的头节点开始一个节点一个节点往后遍历。这样得到的数据就和添加的顺序一致了。
在这里插入图片描述

代码演示

发现键是唯一的,和他爹hashmap一样。
在这里插入图片描述
换顺序,并且覆盖:
输出的和添加的顺序一样,并且key一样的时候覆盖了。
在这里插入图片描述

TreeMap

也没有额外的方法要学,只要知道他本身特点和底层原理就可以了。
在这里插入图片描述

特点

在这里插入图片描述
排序规则:都写的时候以第二个为准。
在这里插入图片描述

代码演示需求一

在这里插入图片描述

升序演示

在这里插入图片描述

升序原因:Integer源码

在这里插入图片描述
这里已经指定了排序的规则:这个规则就是升序排列
在这里插入图片描述
x是this,y是红黑树中已经存在的元素:
在这里插入图片描述
这段代码此时:
在这里插入图片描述

降序演示

第一种方式不能用了,就要用第二种方式,在括号中传入比较器对象
鼠标点下小括号trl+p:
在这里插入图片描述
在这里插入图片描述
运行结果:
现在是升序:
在这里插入图片描述
想要降序:
在这里插入图片描述

代码演示需求二

在这里插入图片描述

代码演示需求三

在这里插入图片描述

HashTable和Properties两个集合

里面有和io相关的方法,等io学完再学
在这里插入图片描述

相关文章:

  • 聚类算法K-means和Dbscan的对比
  • React Native打包报错: Task :react-native-picker:verifyReleaseResources FAILE
  • 《Python星球日记》 第88天:ChatGPT 与 LangChain
  • 心理学层次结构
  • java中的Servlet2.x详解
  • 基于LabVIEW的双音多频系统设计
  • 【PINN】DeepXDE学习训练营(27)——pinn_forward-diffusion_1d_resample.py
  • 游戏:英雄联盟游戏开发代码(谢苏)
  • c++从入门到精通(六)--特殊工具与技术-完结篇
  • leetcode hot100刷题日记——1.两数之和
  • 中文分词与数据可视化03
  • restTemplate
  • 深入解析Spring Boot与Spring Cloud在微服务架构中的实践
  • 什么是dom?作用是什么
  • FreeRTOS的学习记录(临界区保护,调度器挂起与恢复)
  • 利用Shp裁剪nc数据
  • 十一、STM32入门学习之FREERTOS移植
  • 最新缺陷检测模型:EPSC-YOLO(YOLOV9改进)
  • RabbitMQ 工作模式(上)
  • LabVIEW汽车CAN总线检测系统开发
  • 大学2025丨苏大教授王尧:文科最大的危机是阐释世界的能力弱化
  • 家庭医生可提前5天预约三甲医院号源,上海常住人口签约率达45%,
  • 一周观展|一批重量级考古博物馆开馆:从凌家滩看到孙吴大墓
  • 消息人士称俄方反对美国代表参加俄乌直接会谈
  • 四川内江警方通报一起持刀伤人致死案:因车辆停放引起,嫌犯被抓获
  • 韧性十足的中国外贸企业:“不倒翁”被摁下去,还会再弹起来