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

java高级知识之集合

前言

集合是java开发中的重点内容,需要掌握的东西很多,面试中可问的东西很多,无论是深度还是广度。集合框架中Collection对应的实现类如下所示,这些都是要完全掌握,一个可以分为三大类List集合、Set‘集合以及Map集合’。
在这里插入图片描述
其中Collection代表单列集合,而Map代表双列集合,即一个key和可以对应的键值对。

1.Collection集合

Collection集合包括List和Set。他们都有不同的实现类,使用不同的数据结构,实现不同的性能属性。比如ArrayList在查找上会快点,而插入和删除就性能就比较差,LinkedList插入比较快,但是查找性能比较差。
1 、 List系列集合:有序集合:添加的元素是有序、可重复、有索引的

  • ArrayList、LinkedList:有序、可重复、有索引
  • 2、Set系列集合:添加的元素无序、不重复、无索引
  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:按照大小默认升序排序、不重复、无索引
    代码验证本文省略掉了。可以在java环境中试试看看。
    在这里插入图片描述

1.1 Collection常用的方法

常用的方法便是add()、clear()、isEmpty()、size()、remove()、toArray()
Collection的遍历方式,如下图所示:
在这里插入图片描述
这里推荐使用迭代器的方式进行遍历,经过实验证明,迭代器遍历是速度最快的 。

2.List集合

2.1 特点、特有的方法

List系列的集合特点:有序、可重复、有索引
在这里插入图片描述

2.2 List集合的特有方法

List集合因为支持索引,所以多了很多与索引相关的方法,当然,Collection的功能List也都继承了。
在这里插入图片描述
这一系列的集合中,因为List是有索引的,可以直接用for进行循环,其他Collection的遍历方式也能使用。

2.3 ArrayList底层原理

ArrayList基于素组实现的。其中,索引根据索引查找速度会比较快;查询数据通过地址和索引定位,查询任意值数据耗时相同。
删除效率低:可能需要把后面的数据前移。
添加效率极低:可能需要把后面很多的数据后移,再添加元素;或者也可能需要进行数组的扩容。

ArrayList底层原理
1 . 利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组;
2 .添加第一个元素时,底层会创建一个新的长度为10的数组;
3.存满时,会扩容1.5倍;
4.如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准
在这里插入图片描述

2.4 LinkedList底层原理

LinkedList是基于双向链表实现的。链表有什么特点呢,首先链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。
在这里插入图片描述

链表的添加过程如下所示:
在这里插入图片描述
查询慢的特点:无论查询哪个数据都要从头开始。
链表的特点:链表增删相对快。只是修改指针。对首尾元素增删改查的速度极快。
索引Linked特意添加了头部与尾部的增删改的操作。
在这里插入图片描述

3.Set集合

Set系列集合特点:无序:添加数据的顺序和获取出的数据顺序不一致;不重复;无索引。
在这里插入图片描述

  • HashSet:无序、不重复、无索引。
  • LinkedHashset:有序、不重复、无索引。
  • Treeset:排序、不重复、无索引。

3.1 HashSet底层实现原理

需要也别说明的是,在真正了解HashSet集合的底层原理前,需要先搞清楚一个前置知识:哈希值。
在这里插入图片描述
HashSet集合的实现原理

  • 基于哈希表实现。
  • 哈希表是一种中增删改查数据,性能都好比较的数据结构。
    哈希表
  • JDK8之前,哈希表=数组+链表
    在这里插入图片描述
  • JDK8之后,哈希表=数组+链表+红黑树
  • 在这里插入图片描述
    关于红黑树,可理解为一颗自动平衡的二叉树。
    HashTable是一种增删改查性能都较好的数据结构。

3.2 HashSet去重原理

在这里插入图片描述

3.3 LinkedHashSet集合

特点:有序、不重复、无索引;实现依旧是基于数组+链表+红黑树实现。但是,它的每个元素都额外的多了一个双链表的机制记录他前后的位置。

在这里插入图片描述
缺点:占用内存比较大。

3.4 TreeSet集合

特点:不重复、无索引、可排序(默认升序,按照元素大小,由小到大排序)。
底层实现时基于红黑树的排序 。
注意:
对于数字类型:Integer、Double,默认按照本身的大小进行升序排序。
对于字符串类型:默认按照首字母升序排序
对于自定义类型如Student对象,TreeSet无法直接排序。
自定义排序规则
在这里插入图片描述
具体实现代码如下所示:
在这里插入图片描述
关于Collection相关的集合已经结束,在工作过程中,可以根据集合的特性实现不同的业务功能。
在这里插入图片描述
注意并发执行修改出现的问题。如在集合遍历里面添加删除或者添加的问题。
在这里插入图片描述
修改后:
在这里插入图片描述
在这里插入图片描述
用增强for没办法解决并发修改的问题。

4.Map集合

4.1 前置知识:

可变参数

  • 就是一种特殊的形参,定义在方法、构造器的形参列表里面,格式:数据类型…参数名称
    可变参数的特点和好处
  • 特点:可以不传数据给他,可以传一个或者同时传多个数据给它,也可以传一个数组给它。
  • 好处:常常用来灵活的接收数据
    在这里插入图片描述

4.2 概述

在这里插入图片描述

  • Map集合称为双列集合,格式:{key1=value1,key2=value2,key3=value3,….,一次需要存一对数据做为一个元素。
  • Map集合的每个元素“key=value”称为一个键值对/键值对对象/一个Entry对象,Map集合也被叫做“键值对集合。
  • Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能找到自己对应的值。

在这里插入图片描述
在开发中,如果遇到存储一一对应的数据时,就可以考虑使用Map集合来做。
Map集合体系的特点
注意:Map系列集合的特点都是由键决定的,值只是一个附属品,值是不做要求的

  • HashMap(由键决定特点):无序、不重复、无索引;(用的最多)
  • LinkedHashMap (由键决定特点):由键决定的特点:有序、不重复、无索引。
  • TreeMap (由键决定特点):按照大小默认升序排序、不重复、无索引。

4.3 Map集合常用的方法以及遍历

常用的方法: put(key,value),get(key),clear,isEmpty()。无非就是增删改查,清空的操作,判断是否为空。本文不进行代码实操了,有专门的javaapi文档,所以不需要记住,就跟我们不认识的字要去查字典一样。
遍历:一共就有三种,具体如下图所示:
在这里插入图片描述
第一种 方法:
在这里插入图片描述
代码实现:
在这里插入图片描述
第二种遍历方式:
在这里插入图片描述
第三种遍历方式:
推荐使用,代码太简单。直接上代码吧。
在这里插入图片描述

4.4 HashMap集合

特点:无序、无重复、无索引。
底层原理

  • HashMap跟Hashset的底层原理是一模一样的,都是基于哈希表实现的。
    实际上:原来学的Set系列集合的底层就是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据而已
    哈希表:
  • JDK8之前,哈希表=数组+链表
  • JDK8之后,哈希表=数组+链表+红黑树
  • 哈希表是一种增删改查性能都较好的数据结构。
  • HashMap的键依赖hashCode方法和equals方法保证键的唯一。
  • 如果键存储的是自定义类型的对象,可以通过重写hashcode和equals方法,这样可以保证多个对象内容一样时,HashMap集合就能认为是重复的。

4.5 HashMap集合

LinkedHashMap集合的原理:
底层数据结构依然是基于哈希表实现的,只是每个键值对元素又额外的多了一个双链表的机制记录元素顺序(保证有序)。
实际上:原来学习的LinkedHashset集合的底层原理就是LinkedHashMap。
在这里插入图片描述

4.6 TreeMap特点

TreeMap (由键决定特点):按照键的大小默认升序排序、不重复、无索引。
TreeMap
特点:不重复、无索引、可排序(按照键的大小默认升序排序,只能对键排序)
原理:TreeMap跟TreeSet集合的底层原理是一样的,都是基于红黑树实现的排序。
TreeMap集合同样也支持两种方式来指定排序规则
让类实现Comparable接口,重写比较规则。
TreeMap集合有一个有参数构造器,支持创建Comparator比较器对象,以便用来指定比较规则。
在这里插入图片描述
或者这样更加灵活
在这里插入图片描述

结束语

结束了,关于集合看起来很多,其实有些实现原理是重复的,比如Set和Map的实现类,Set的实现类是基于Map实现的。

相关文章:

java高级知识之集合

前言 集合是java开发中的重点内容,需要掌握的东西很多,面试中可问的东西很多,无论是深度还是广度。集合框架中Collection对应的实现类如下所示,这些都是要完全掌握,一个可以分为三大类List集合、Set‘集合以及Map集合…...

deepseek + kimi 高效生成PPT

1.在deepseek中生成ppt大纲 2.将大纲复制到kimi中生成PPT kimi:https://kimi.moonshot.cn/...

hadoop之MapReduce:片和块

假如我现在500M这样的数据,如何存储? 500M 128M 128M 128M 116M 分为四个块进行存储。 计算的时候,是按照片儿计算的,而不是块儿。 块是物理概念,一个块就是128M ,妥妥的,毋庸置疑。 片是逻辑概念&…...

好好说话:深度学习扫盲

大创项目是和目标检测算法YOLO相关的,浅浅了解了一些有关深度学习的知识。在这里根据本人的理解做一些梳理。 深度学习是什么? 之前经常听到AI,机器学习,深度学习这三个概念,但是对于三者的区别一直很模糊。 AI&…...

ASP.NET Core的贫血模型与充血模型

目录 概念 需求 贫血模型 充血模型 总结 概念 贫血模型:一个类中只有属性或者成员变量,没有方法。充血模型:一个类中既有属性、成员变量,也有方法。 需求 定义一个类保存用户的用户名、密码、积分;用户必须具有…...

【愚公系列】《Python网络爬虫从入门到精通》001-初识网络爬虫

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主&…...

Kubernetes控制平面组件:etcd(一)

云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)kubectl 和 …...

2100年芜湖人的一天:张明的生活剪影

2100年芜湖人的一天:张明的生活剪影 破晓 6:30 "沙沙"的微风声轻轻掠过耳畔,杨柳的沙沙声混合着若有若无的鸟鸣,张明的意识从深邃的梦境中缓缓浮现。这并非真实的自然声响,而是他的脑机接口精心编织的唤醒交响曲。量子…...

外贸网站源码 助力企业抢占蛇年市场先机!

在竞争激烈的外贸市场中,蛇年无疑是企业寻求突破与增长的关键一年。外贸网站源码为企业提供了快速搭建专业外贸网站的解决方案,助力企业在新的一年抢占市场先机。 快速上线 时间就是商机,尤其是在蛇年这样充满变数和机遇的年份。外贸网站源码…...

verilog练习:i2c slave 模块设计

文章目录 前言1.结构2.代码2.1 iic_slave.v2.2 sync.v2.3 wr_fsm.v2.3.1 状态机状态解释 2.4 ram.v 3. 波形展示4. 建议5. 资料总结 前言 首先就不啰嗦iic协议了,网上有不少资料都是叙述此协议的。 下面将是我本次设计的一些局部设计汇总,如果对读者有…...

项目6:基于大数据校园一卡通数据分析和可视化

1、项目简介 本项目是基于大数据的清华校园卡数据分析系统,通过Hadoop,spark等技术处理校园卡交易、卡号和商户信息数据。系统实现消费类别、男女消费差异、学院消费排行和年级对比等分析,并通过Web后端和可视化前端展示结果。项目运行便捷&…...

Linux常见系统日志类型

目录 系统日志(/var/log/syslog 或 /var/log/messages) 认证日志(/var/log/auth.log 或 /var/log/secure) Web服务器日志(/var/log/apache2/ 或 /var/log/nginx/) MySQL日志(/var/log/mysql/…...

npm 常用命令大全

npm 常用命令大全 下载包 npm install清理缓存 npm cache clean --force查看当前配置 npm config get registry设置淘宝镜像 npm config set registry https://registry.npmmirror.com查看 npm 版本 npm -vnpm 设置超时时间 npm config set fetch-timeout 600更新依赖 …...

java.io.InvalidClassException

类实现序列问题 如果实现了序列,最好生成序列号,因为类结构发生改变时,会报错 java.io.InvalidClassException 所以实现序列,需要生成序列号 private static final long serialVersionUID 1L;...

Datawhale 组队学习 Ollama教程 task1

一、Ollama 简介 比喻:Ollama 就像是一个“魔法箱子”,里面装满了各种大型语言模型(LLM)。你不需要懂复杂的魔法咒语(配置),只需要轻轻一按(一条命令),就能让…...

大模型基本原理(二)——ChatGPT的工作原理

如何得到一个ChatGPT? 1、无监督预训练:通过大量的文本数据集进行无监督训练,得到一个基座模型(只会续写文本) 2、监督微调:通过一些人类撰写的高质量对话数据对基座模型进行监督微调,得到一个…...

成为高能量体质:从身体神庙到精神圣殿的修炼之路

清晨五点,当城市还在沉睡,瑜伽垫上的汗水已经折射出第一缕阳光。这不是苦行僧的自虐,而是高能量体质者的日常仪式。在这个能量稀缺的时代,如何把自己修炼成一座小型核电站?答案就藏在身体的每个细胞里。 一、能量管理…...

51c自动驾驶~合集50

我自己的原文哦~ https://blog.51cto.com/whaosoft/13280022 #VLA 主流方案全解析 旨在让智能体在物理世界中通过感知、决策和行动来实现目标,而视觉 - 语言 - 动作(VLA)模型作为其中的关键技术,近年来备受关注。VLA 模型能够…...

测试自动化落地方向

一、视觉回归自动化测试(低成本高回报) 痛点: UI 频繁迭代导致视觉问题难覆盖 方案: 引入Applitools或SikuliX做视觉比对(无需维护元素定位) 关键路径截图比对,自动检测 UI 错位/样式问题 亮点…...

论文阅读:MGMAE : Motion Guided Masking for Video Masked Autoencoding

MGMAE:Motion Guided Masking for Video Masked Autoencoding Abstract 掩蔽自编码(Masked Autoencoding)在自监督视频表示学习中展现了出色的表现。时间冗余导致了VideoMAE中高掩蔽比率和定制的掩蔽策略。本文旨在通过引入运动引导掩蔽策略&#xff0…...

【嵌入式Linux应用开发基础】文件I/O基础编程

目录 一、文件I/O简介 二、文件描述符 2.1. 唯一性 2.2. 抽象性 2.3. 有限性 三、文件操作函数 四、标准文件I/O函数 五、文件执行权限 5.1. 权限类型 5.2. 权限分配对象 5.3. 权限表示方法 5.4. 权限设置命令 5.5. 权限设置的重要性 5.6. 实例说明 六、设备文件…...

Java 反射机制的安全隐患与防范措施:在框架开发与代码审计中的应用

前言 在 Java 编程的广阔领域中,反射机制堪称一把神奇且强大的钥匙,它为开发者打开了通往动态编程的全新大门。借助反射,Java 程序获得了在运行时自我审视和操作的独特能力,极大地增强了代码的灵活性与适应性。 简单来讲&#x…...

【JS】实现一个hexo插件并发布

hexo插件生成 在你的 hexo blog 目录,找到 node_modules. 新建一个文件夹。然后执行 npm init npm 会引导你生成 package.json 这是你的包的描述文件。需要注意的是,所有的 hexo 插件必须以 hexo - 开头,否则 hexo 不会加载。 如果hexo g中没…...

【Java 面试 八股文】MySQL 篇

MySQL 篇 1. MySQL中,如何定位慢查询?2. 那这个SQL语句执行很慢,如何分析呢?3. 了解过索引吗?(什么是索引)4. 索引的底层数据结构了解过吗?5. B树和B树的区别是什么呢?6.…...

ES6 Proxy 用法总结以及 Object.defineProperty用法区别

Proxy 是 ES6 引入的一种强大的拦截机制,用于定义对象的基本操作(如读取、赋值、删除等)的自定义行为。相较于 Object.defineProperty,Proxy 提供了更灵活、全面的拦截能力。 1. Proxy 语法 const proxy new Proxy(target, hand…...

vue中使用高德地图自定义掩膜背景结合threejs

技术架构 vue3高德地图2.0threejs 代码步骤 这里我们就用合肥市为主要的地区,将其他地区扣除,首先使用高德的webapi的DistrictSearch功能,使用该功能之前记得检查一下初始化的时候是否添加到plugins中,然后搜索合肥市的行政数据…...

tomcat如何配置保存7天滚动日志

在 Tomcat 中,logging.properties 文件是用于配置 Java 日志框架(java.util.logging)的。若要实现 catalina.out 日志保存 7 天,且每天的日志文件名带有时间戳,可以按以下步骤进行配置: 1. 备份原配置 在修…...

ffmpeg -pix_fmts

1. ffmpeg -pix_fmts -loglevel quiet 显示ffmpeg支持的像素格式 2. 输出 选取部分输出结果 Pixel formats: I.... Supported Input format for conversion .O... Supported Output format for conversion ..H.. Hardware accelerated format ...P. Paletted format ..…...

Python----PyQt开发(PyQt高级:图像显示,定时器,进度条)

一、图像显示 1.1、增加图标 1.直接创建setWindowIcon(QIcon(灯泡.jpg)) import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton from PyQt5.QtGui import QIconclass MainWindow(QMainWindow):def __init__(self):super(MainWindow, self).__init_…...

Tomcat添加到Windows系统服务中,服务名称带空格

要将Tomcat添加到Windows系统服务中,可以通过Tomcat安装目录中“\bin\service.bat”来完成,如果目录中没有service.bat,则需要使用其它方法。 打到CMD命令行窗口,通过cd命令跳转到Tomcat安装目录的“\bin\”目录,然后执…...