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(尽管这通常不是一个好的实践),你仍然可以查询它。你只…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...