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

彻底掌握双列集合——Map接口以及实现类和常用API及其底层原理

目录

前言

双列集合

Map

常见API

遍历方式

HashMap实现类 

LinkedHashMap实现类

TreeMap实现类

可变参数

Collections 


前言

学习之前如果单列集合不了解的,可以看上期文章。

双列集合

特点:

一次能存一对元素(两个元素),这两个元素一一对应;

左边的叫做键,右边的叫做值;键不可以重复,值可以重复。

键和值 这个整体称为“键值对”或者“键值对象”,在java中叫做“Entry对象”。

Map

Map接口:有两个实现类,HashMap、TreeMap;其中LinkedHashMap类继承于HashMap

Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的。

常见API

V  put(K key, V value):添加元素(如果添加的键值对的键重复了,那么就会覆盖,把最近添加的键值对加入集合,把之前的覆盖,并且返回之前键值对的值)
V remove(Object key):根据键删除键值对元素
void clear():移除所有的键值对元素
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
int size():集合的长度,也就是集合中键值对的个数

遍历方式

第一种:(键找值)

 第二种:(键值对)

 

 第三种:(Lambda表达式)

default void forEach(BiConsumer<?  super  K, ?  super  V>  action):结合lambda遍历Map集合

HashMap实现类 

无序:存和取的顺序不一样。

不重复:键是不能重复的。

无索引。

和HashSet底层原理一样,都是哈希表结构。(利用键计算哈希值,跟值无关)

于HashSet不同的点是:当计算出来的索引位置已经有键值对时,跟HashSet一样用equals方法比较键,如果键一样就覆盖,如果不一样时,新元素直接挂在老元素的下面形成链表。(当链表长度超过8并且数组长度大于等于64时,自动转为红黑树)

如果键存储的是自定义对象,就要重写hashCode与equals方法;如果值是自定义对象,就不需要重写hashCode与equals方法。

LinkedHashMap实现类

有序:存和取的顺序一致。(由键决定)

不重复、无索引(由键决定)

原理:底层数据结构是哈希表,只是每个键值对元素有额外的多了一个双链表的机制记录存储顺序。

TreeMap实现类

由键决定:不重复、无索引、可排序

底层原理跟TreeSet一样,都是红黑树结构

可排序也是和TreeSet一样。

方式一:实现Comparable接口,指定规则

方式二:创建集合时传递Comparator比较器对象制定规则

可变参数

格式:属性类型...名字;举例:int...a;

可变参数的底层就是一个数组。

Collections 

不是集合,是集合的工具类。

public static ‹T › boolean addAll(Collection<T>c, T... elements):批量添加元素
public static void shuffle(List<?> list):打乱List集合元素的顺序

public static ‹T› void sort (List<T> list):排序
public static ‹T› void sort(List<T > list, Comparator<T> c):根据指定的规则进行排序
public static ‹T› int binarySearch (List‹T> list, T key) ;以二分查找法查找元素
public static ‹T› void copy(List<T > dest, List<T> src) ;拷贝集合中的元素
public static ‹T › int fill (List<T > list, T  obj) :使用指定的元素填充集合
public static ‹T› void max/min(Collection<T > coll):根据默认的自然排序获取最大/小值
public static ‹T› void  swap (List‹?> list, int i, int j): 交换集合中指定位置的元素

http://www.xdnf.cn/news/16090.html

相关文章:

  • python学智能算法(二十九)|SVM-拉格朗日函数求解中-KKT条件
  • Python爬虫--Xpath的应用
  • 分布式限流算法与组件
  • jenkins 入门指南:从安装到启动的完整教程
  • 分布式系统中的缓存设计与应用
  • 网络调制技术对比表
  • 算法竞赛备赛——【图论】拓扑排序
  • 关于网络安全等级保护的那些事
  • 重磅发布:Oracle ADG 一键自动化搭建脚本
  • java设计模式 -【策略模式】
  • 为什么本地ip记录成0.0.0.1
  • 扫地机产品--同理心地图的方法,展现一个功能的痛点提炼
  • 智能营销革命:AI如何重塑个性化广告的创作逻辑
  • 汽车电子架构
  • LeetCode热题100--24. 两两交换链表中的节点--中等
  • 视频孪生赋能数字住建:构建智慧城市新蓝图​
  • TDengine 的 HISTOGRAM() 函数用户手册
  • 如何在 npm 上发布 Element Plus 二次封装组件
  • 算法竞赛备赛——【图论】最小生成树
  • 关于针对 DT_REG 出现红色波浪线的问题(编译错误/IDE警告),以下是 精准解决方案,保持你的代码功能完全不变:
  • 基于数据挖掘的短视频点赞影响因素分析【LightGBM、XGBoost、随机森林、smote】
  • 如何在macOS上修改iPhone的定位
  • uniapp拦截返回事件
  • Android Multidex 完全解析:解决64K方法数限制
  • LLM 幻觉一般是由于什么产生的,在模型什么部位产生
  • 编程与数学 03-001 计算机组成原理 21_服务器计算机组成实例解析
  • Django学习之旅--第13课:Django模型关系进阶与查询优化实战
  • STM32 基础知识 定时器【概念】
  • Go语言实现DNS解析与域名服务:从基础到生产实践
  • SOLIDWORKS2025教育版集成了电气与自动化设计功能