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(尽管这通常不是一个好的实践),你仍然可以查询它。你只…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...



