Java集合简略记录
一、集合体系结构
单列集合:Collection
双列集合:Map
二、单列集合

List系列集合:添加的元素是有序、可重复、有索引
有序指的是存和取的顺序是一致的,和之前排序的从小到大是没有任何关系的
Set系列集合:添加的元素是无序、不重复、无索引
2.1、Collection
Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。
| public boolean add(E e) | 把给定的对象添加到当前集合中 |
| public void clear() | 清空集合中所有的元素 |
| public boolean remove(E e) | 把给定的对象在当前集合中删除 |
| public boolean contains(Object obj) | 判断当前集合中是否包含给定的对象 |
| public boolean isEmpty() | 判断当前集合是否为空 |
| public int size() | 返回集合中元素的个数/集合的长度 |
代码实例
2.1.1、添加元素
public class CollectionTest {public static void main(String[] args) {/*Collection是一个接口,我们不能直接创建他的对象所以,现在我们为了学习Collection的方法时,只能创建他实现类的对象。实现类:ArrayList 作为一个例子目的:为了学习Collection接口里面的方法*///自己练习的时候按照自己的方式创建就行Collection<String> collection =new ArrayList<>();//添加元素//细节一:如果我们要往List系列集合中添加元素,那么方法永远返回true,因为List系列的是允许元素重复的。//细节二:如果要往Set系列集合中添加元素,如果当前要添加元素不存在,方法返回true,表示添加成功。// 如果当前要添加元素已经存在,方法返回false,表示添加失败。// 因为Set系列的集合不允许元素重复。collection.add("张三");collection.add("李四");collection.add("王五");System.out.println(collection);}
}
运行结果:

2.1.2、清空集合
public class CollectionTest {public static void main(String[] args) {Collection<String> collection =new ArrayList<>();collection.add("张三");collection.add("李四");collection.add("王五");System.out.println(collection);//清空集合collection.clear();System.out.println(collection);}
}
运行结果:

2.1.3、删除元素
package cn.ysy.collection;import java.util.ArrayList;
import java.util.Collection;public class CollectionTest {public static void main(String[] args) {Collection<String> collection =new ArrayList<>();collection.add("张三");collection.add("李四");collection.add("王五");System.out.println(collection);//删除//细节一:因为Collection里面定义的是共性的方法(要同时兼顾到List和Set),所以此时不能通过索引进行删除,只能通过元素的对象进行删除。//细节二:方法会有一个布尔类型的返回值,删除成功返回ture,删除失败返回false。System.out.println(collection.remove("张三"));System.out.println(collection);}
}
运行结果:

2.1.4、判断元素是否存在
public class CollectionTest {public static void main(String[] args) {Collection<String> collection =new ArrayList<>();collection.add("张三");collection.add("李四");collection.add("王五");System.out.println(collection);//判断元素是否包含//细节:底层是依赖equals方法进行判断是否存在的。//所以,如果集合中存储的是自定义对象,也想用过contains方法来判断是否包含,那么在javabean类中,一定要重写equals方法。//在String中,==比较引用地址是否相同,equals()比较字符串的内容是否相同System.out.println(collection.contains("张三"));}
}
运行结果:
![]()
引申:如果是自定义对象,又该怎么比较呐?
创建一个User实体类:
public class User {private String name;private int age;public User() {}public User(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "User{name = " + name + ", age = " + age + "}";}//重写equals方法@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return age == user.age && Objects.equals(name, user.name);}}
再写一个Collection测试类:
public class CollectionTest02 {public static void main(String[] args) {//1.创建集合对象Collection<User> collection =new ArrayList<>();//2.创建三个用户对象User user1 = new User("张三", 20);User user2 = new User("李四", 21);User user3 = new User("王五", 22);//3.将User对象添加到集合中collection.add(user1);collection.add(user2);collection.add(user3);//4.判断集合中某一个use对象是否包含User user4 = new User("张三", 20);//如果同姓名和年龄,则认为是同一个用户,结果应该是true,但是真实运行结果却是false//因为contains方法底层调用的是equals方法//如果存的是自定义对象,没有重写equals,那么默认使用Object类中的equals方法进行判断//而Object类中的equals方法比较的是地址值//需求:如果同姓名和年龄,则认为是同一个用户,结果应该是true//所以,需要在自定义的javabean类中,重写equals方法就可以了System.out.println(collection.contains(user4));}
}
没重写equals方法的话,打印结果是false,重写之后,打印结果就是true了

2.1.5、判断集合是否为空和获取集合长度
public class CollectionTest {public static void main(String[] args) {Collection<String> collection =new ArrayList<>();collection.add("张三");collection.add("李四");collection.add("王五");System.out.println(collection);//判断集合是否为空System.out.println(collection.isEmpty());//获取集合的大小System.out.println(collection.size());}
}
运行结果:

2.1.6、Collection的遍历方式
迭代器遍历
增强for遍历
lambda表达式
之所以不用普通的for遍历,因为set集合中没有索引,所以不能通过普通for进行遍历
2.1.6.1、迭代器遍历
迭代器在java中的类是Iterator,迭代器是集合专用的遍历方式。
迭代器遍历集合的时候是不依赖索引的
Collection集合获取迭代器
Iterator<E> iterator() 返回迭代器对象,默认指向当前集合的0索引
Iterator中的常用方法boolean hasNext() 判断当前位置是否有元素,有元素返回tru额,反之false
E next() 获取当前位置的元素,并将迭代器对象移向下一个位置
public class CollectionIteratorTest {public static void main(String[] args) {Collection<String> collection =new ArrayList<>();//添加元素collection.add("a");collection.add("b");collection.add("c");collection.add("d");//创建迭代器Iterator<String> iterator = collection.iterator();//利用迭代器遍历集合while(iterator.hasNext()){String result = iterator.next();System.out.println(result);}}
}
细节注意点:
1、当遍历完成时,还强行调用next()方法取获取元素时,就会报错NoSuchElementException
2、迭代器遍历完毕,指针不会复位
3、循环中智能用一次next方法
4、迭代器遍历时,不能用集合的方法进行增加或者删除
2.1.6.2、增强for遍历
- 增强for的底层就是迭代器,为了简化迭代器的代码书写的
- 它是JDK5之后出现的,其内部原理就是一个Iterator迭代器
- 所有的单列集合和数组才能用增强for进行遍历
格式:
for (元素的数据类型 变量名 : 数组或者集合){
}
idea快捷生成 集合名.for
增强for的细节:修改增强for中的变量,不会改变集合中原本的数据
for(String s : list){System.out.println(s);
}
2.1.6.3、Lambda表达式遍历
得益于JDK8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。
collection.forEach(s -> System.out.println(s));
2.2、List
- Collection的方法List都继承了
- List集合因为有索引,所以多了很多索引操作的方
void add(int index,E element) 在此集合中的指定位置插入指定的元素
E remove(int index) 删除指定索引处的元素,返回被删除的元素
E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
E get(int index) 返回指定索引处的元素
细节:利用remve删除元素时,如果类型是整数,那么此时删除的是1这个元素,还是1索引上的元素?为什么?
因为在调用方法的时候,如果方法出现了重载现象,有限调用:实参跟形参类型一致的那个方法。
比如:list.remove(1) 删除的就是1索引位置的元素
如果要删除整数1,则可以手动装箱,将基本数据类型的1,变成Integer类型
Integer i = Integer.valueOf(1);
list.remove(i);// 此时删除的就是元素1了
2.3.1、List集合的遍历方式
2.3.1.1、迭代器
//迭代器Iterator<String> iterator = list.iterator();while (iterator.hasNext()){String next = iterator.next();System.out.println(next);}
2.3.1.2、列表迭代器
//列表迭代器遍历
//获取一个列表迭代器的对象,里面的指针默认也是指向0索引的
//额外添加了一个方法;在遍历的过程中,可以添加元素ListIterator<String> it = list.listIterator();while (it.hasNext()){String next = it.next();if ("2".equals(next)){it.add("qqqq");}}System.out.println(list);
不能使用集合的方法取添加,比如list.add()会报错并发修改异常,所以要用迭代器本身的方法进行添加

结果:
![]()
2.3.1.3、增强for
//增强forfor (String s : list) {System.out.println(s);}
2.3.1.4、Lambda表达式
//Lambda表达式list.forEach(s -> System.out.println(s));
2.3.1.5、普通for循环
//普通for循环遍历for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}
2.3.2、五种遍历方式的对比

2.3、数据结构

2.3.1、栈
栈的特点 :先进后出
数据进入栈模型的过程称为:压/进栈数据离开栈模型的过程称为:弹/出栈
2.3.2、队列
队列特点:先进先出
数据从后端进入队列模型的过程称为:入队列数据从前端离开队列模型的过程称为:出队列
2.3.3、数组
数组是一种查询快,增删慢的模型
查询速度快:查询数据通过地址值和索引定位,查询任意数据耗时相同。(元素在内存中是连续存储的)删除效率低:要将原始数据删除,同时后面每个数据前移
添加效率低:添加位置后的每个数据后移,再添加元素
2.3.4、链表
链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。
链表查询慢,无论查询哪个数据都要从头开始找
链表增删相对快
2.3.5、树

二叉查找树:

添加节点规则:

遍历方式:
前序遍历:

中序遍历:

后序遍历:

层序遍历:

平衡二叉树:

红黑树:

2.4、ArrayList
底层原理:

源码分析
情况一:初始长度为0

情况二:当集合长度满时

2.5、LinkedList

源码分析

2.6、迭代器源码

2.7、泛型
泛型的好处:


2.8、Set

2.9、HashSet





2.10、LinkedHashSet


2.11、TreeSet





三、双列集合

3.1、Map

3.1.1、Map的三种遍历方式
3.2、HashMap


3.3、LinkedHashMap

3.4、TreeMap


相关文章:
Java集合简略记录
一、集合体系结构 单列集合:Collection 双列集合:Map 二、单列集合 List系列集合:添加的元素是有序、可重复、有索引 有序指的是存和取的顺序是一致的,和之前排序的从小到大是没有任何关系的 Set系列集合:添加的元素是…...
能获取淘宝商品简化链接的浏览器书签
零.冗长的商品链接 访问网页版本淘宝时,浏览器的地址栏显示的链接太长就像这样(此链接非真实商品): 于是使用如下方法 一.使用浏览器书签获取淘宝商品简化链接 1.新建书签 Chrome - 打开书签管理器(CtrlShiftO) - 左侧选择书签…...
JMeter Plugins Manager---插件安装
参考文章:https://blog.51cto.com/u_14126/6291032 需求: 安装【jpgc - Standard Set】插件 常用插件: 点击下载–报错如下: Failed to apply changes:Cannotapplychanges:Haveno write accessforJMeterdirectories,notpossib…...
docker-compose入门级实战教程
🌟🌌 欢迎来到知识与创意的殿堂 — 远见阁小民的世界!🚀 🌟🧭 在这里,我们一起探索技术的奥秘,一起在知识的海洋中遨游。 🌟🧭 在这里,每个错误都…...
MATLAB sort
对数字数组排序对字符串排序对 cell 数组排序降序排序对多维数组排序对结构体数组排序注意事项 在 MATLAB 中, sort 函数用于对数组进行排序。 sort 函数可以对数字数组、字符串、 cell 数组等进行升序或降序排序。以下是 sort 函数的一些常见用法:…...
AB测试实战
AB测试实战 1、AB测试介绍🐾 很多网站/APP的首页都会挂一张头图(Banner),用来展示重要信息,头图是否吸引人会对公司的营收带来重大影响,一家寿险公司Humana设计了如下三张头图,现在需要决定使用哪一张放到首页&#x…...
Java高级面试精粹:问题与解答集锦(六)
Java 面试问题及答案 1. 请解释Java中的多线程概念,并说明如何实现它? 答案: 多线程是指在Java程序中同时运行多个线程的功能。线程是程序执行的最小单元,Java中的多线程可以通过继承Thread类或实现Runnable接口来实现。 继承Th…...
MySQL之数据库数据库范式学习笔记(二)
三大范式 范式是数据库设计中的概念,用于规范化数据结构,以减少数据冗余并确保数据的一致性和完整性。MySQL 数据库设计通常遵循一定的范式,其中最常见的是第一至第三范式。以下是各个范式的简要说明: 第一范式(1NF&…...
【Qt】 new成功,但是没有进入到构造函数。
NameTest工程中 nametest.cpp NameTest::NameTest() {pdata new privateAB; }NameTest::~NameTest() {if (pdata){privateAB *p (privateAB *)pData; //void *pdata nullptr;delete p;pdata nullptr;} }内部类: privateAB #include "private.h"#i…...
高清多媒体接口(High Definition Multimedia Interface, HDMI)
目录 1. Overview1.1. Time Minimized Differential Signal(TMDS)1.2. Display Data Channel(DDC)1.3. Consumer Electronics Control(CEC)1.4. HDMI Ethernet and Audio Return Channel(HEAC)1.5. Hot Plug Detected(HPD)2. Signaling and Encoding3. Video4. Control and Con…...
Spring AI 第二讲 之 Chat Model API 第五节HuggingFace Chat
HuggingFace Inference Endpoints 允许您在云中部署和提供机器学习模型,并通过 API 对其进行访问。 开始使用 有关 HuggingFace Inference Endpoints 的更多详细信息,请访问此处。 前提条件 添加 spring-ai-huggingface 依赖关系: <d…...
【笔记】Sturctured Streaming笔记总结(Python版)
目录 相关资料 一、概述 1.1 基本概念 1.2 两种处理模型 (1)微批处理 (2)持续处理 1.3 Structured Streaming和Spark SQL、Spark Streaming关系 二、编写Structured Streaming程序的基本步骤 三、输入源 3.1 File源 &a…...
Python函数进阶
文章目录 1 函数多返回值2 函数多种传参方式2.1 位置参数2.2 关键字参数2.3 缺省参数2.4 不定长参数 3 匿名函数函数作为参数传递lambda匿名函数 1 函数多返回值 def test_return():return 1,2,3 x,y,z test_return() print(x) print(y) print(z)2 函数多种传参方式 2.1 位置参…...
[知识点]c++ delete与delete[ ]
在C中,delete 和 delete[] 是用于释放动态分配的内存的关键字。它们的使用取决于内存是如何分配的。具体来说: delete 用于释放通过 new 分配的单个对象。delete[] 用于释放通过 new[] 分配的数组。 如果你通过 new 分配了一个单个对象,那么…...
iCloud如何被高效利用?
1.同步设备 同步设备是指利用云服务(如iCloud)将多台设备上的数据保持同步,确保这些设备上的信息始终保持一致。以下是详细说明如何同步设备使用iCloud: 1. 打开iCloud设置:在iOS设备上,打开“设置”应用…...
月入30000的软件测试人员,简历是什么样子的?
我们都知道,简历是一个人进入职场的敲门砖。从某种层面来说,简历也像一个人的具象身份证,或者专业资格证。所以,一份简历的好坏,不仅关乎个人的“脸面”,更关乎你是不是一个有“含金量”的技术人员。 所以…...
nginx官网源代码方式安装nginx并编译
从Nginx官网下载特定版本的源代码并编译安装的步骤如下: 确定需要的版本: 前往Nginx 官方网站下载页面,选择你需要的Nginx版本。 下载源代码: 使用wget命令下载源代码压缩包。例如,下载1.21.0版本的Nginx:…...
iOS ActivityViewController使用
UIActivityViewController是iOS中用于展示一个活动列表的视图控制器,允许用户通过各种内置或第三方的应用来分享内容。以下是使用UIActivityViewController分享文本内容的示例代码: import UIKit class ViewController: UIViewController { IBA…...
新手快速上手IDEA【常用快捷键】
目录 一、常用二、进阶(提高编码速度)三、其他四、查找、替换与关闭最后 一、常用 说明快捷键复制代码ctrl c粘贴ctrl v剪切ctrl x撤销ctrl z反撤销ctrl shift z保存-save allctrl s全选-select allctrl a 二、进阶(提高编码速度&a…...
MySQL里如果有字段是function怎么查询呢?
在MySQL中,字段名通常不会命名为function,因为FUNCTION是MySQL的保留关键字,用于定义存储函数。但是,如果你确实有一个字段名叫做function(尽管这通常不是一个好的实践),你仍然可以查询它。你只…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...



