java高级知识之集合

news2025/2/12 14:47:45

前言

集合是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实现的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

deepseek + kimi 高效生成PPT

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

好好说话:深度学习扫盲

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

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

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

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

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

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

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

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后端和可视化前端展示结果。项目运行便捷&…

Datawhale 组队学习 Ollama教程 task1

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

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

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

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

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

51c自动驾驶~合集50

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

论文阅读: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. 实例说明 六、设备文件…

【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.…

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

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

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\”目录,然后执…

2025.2.10 每日学习记录3:技术报告只差相关工作+补实验

0.近期主任务线 1.完成小论文准备 目标是3月份完成实验点1的全部实验和论文。 2.准备教资笔试 打算留个十多天左右,一次性备考笔试的三个科目 1.实习申请技术准备:微调、Agent、RAG 据央视财经,数据显示,截至2024年12月…

微生物学术语和定义 | 微生物学词汇表

​ 微生物学作为一门研究微生物及其与环境、宿主和其他生物相互作用的科学,涵盖了广泛的学科领域和专业术语。然而,由于微生物学的快速发展和跨学科融合,许多术语的定义和使用在不同领域中可能存在差异甚至混淆。 随着新冠疫情的全球蔓延&am…