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

彻底掌握双列集合——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.dtcms.com/a/295023.html

相关文章:

  • 1688商品数据采集的应用行业与接入方式
  • 人工智能之数学基础:事件间的运算
  • JVM、Dalvik、ART垃圾回收机制
  • OpenLayers 快速入门(八)事件系统
  • java基础(the 15th day)
  • freelancer是什么用工模式?有什么好处和坏处呢?
  • Log4j2漏洞vul-hub通关教程
  • 根据图片的r值来进行透明剔除
  • SpringBoot RESTful API设计指南
  • C++day1
  • #Linux内存管理# 在一个播放系统中同时打开几十个不同的高清视频文件,发现播放有些卡顿,打开视频文件是用mmap函数,请简单分析原因。
  • SQL难点突破之复杂业务逻辑的SQL查询实战
  • pcb碳油板工艺流程
  • zabbix基于GNS3监控部署
  • 学校电子钟系统时间为何不同步?如何解决
  • 面试实战,问题六,被问数据库索引,怎么回答
  • 期权遇到股票分红会调整价格吗?
  • 使用JMeter进行压力测试(以黑马点评为例、详细图解)
  • 定义损失函数并以此训练和评估模型
  • 力扣面试150题--搜索旋转排序数组
  • RT_thread的工作原理及应用
  • java有哪些字符需要转译
  • 2026 拼多多秋招内推码(提前批)
  • 前端学习之JavaScript事件监听解析
  • Bonk发币教学全流程
  • 欧盟网络安全标准草案EN 18031详解
  • JDialong弹窗
  • 计算机网络学习----Https协议
  • 亚马逊云科技 上海AI研究院 突然解散 | AI早报
  • 13. event.target 和 event.currentTarget 区别