【JavaSE】集合(学习笔记)
一、数据结构
1、栈
- 压栈 / 弹栈
- 栈顶元素、栈底元素
- 先进后出
2、队列
- 入队列 / 出队列
- 前端、后端
- 先进先出
3、数组
查询效率高,增删效率低
4、链表
查询效率低(必须从头找),增删效率高
5、哈希表
- 比较方法
- 哈希值
- equals
- 结构:数组 + 链表
- 元素位置:“hashCode % 位置”
- 相同位置的元素通过链表形式连接
二、集合类体系结构
- Collection:单列 - List:可重复 - ArrayList
- LinkedList
 
- Set:不可重复
 1. HashSet
 2. TreeSet
 
- List:可重复 
- Map:双列 - HashMap
 
三、Collection
1、概述
单例集合的顶层接口,无直接实现
2、创建对象
多态:利用ArrayList
Collection<String> c = new ArrayList<String>();
3、成员方法
(1)add():添加元素
 
boolean add(E e) 	// 永远返回true,重写了`toString()`方法
(2)remove():移除元素
 
boolean remove(Object o)
(3)clear():清空集合
 
void clear()
(4)contains():判断是否存在
 
boolean contains(Object o)
(5)isEmpty():判空
 
boolean isEmpty()
(6)size():元素个数
int size()
4、快捷键补充
A/t + 7  :查看结构框架
四、迭代器Iterator
1、概述
Iterator:迭代器用于集合遍历
Iterator<E> iterator();:返回集合元素的迭代器
迭代器依赖于集合存在
2、常用方法
1. `E next()`:返回迭代器下一元素
2. `boolean hasNext()`:是否存在下一元素
while(it.hasNext()){String s = it.next();sout(s);
}
五、List及其子类
1、List
List:有序集合,可以控制每个元素的插入位置,可以索引访问元素
2、List特有方法
(1)add(index, e):指定插入
//定义
void add(int index, E e)
(2)remove(index):指定删除
//定义
E remove(int index)		//返回老元素
(3)set(index, e):指定修改
//定义
E set(int index, E e)	//返回老元素
(4)get(index):指定获取
//定义
E get(int index)		//返回老元素
3、ListIterator
(1)概述
ListIterator:列表迭代器,是List集合特有的
(2)特点
1. 可以任意方向遍历
2. 可以迭代时修改集合
(3)方法
1. `E previous()`:返回迭代器上一元素
2. `boolean hasPrevious()`:是否存在上一元素
3. `void add(E e)`:插入指定元素
List<String> list = new ArrayList<String>();
ListIterator<String> it = list.listiterator();
while(it.hasNext()){String s = it.next();if(s.equals("world")){it.add("javaee");}
}
4、ArrayList
数组实现:查询快,增删慢
5、LinkedList
(1)概述
链表实现:查询慢,增删快
(2)特有功能
1. `void addFirst()`
2. `void addLast()`
3. `E getFirst()`
4. `E getLast()`
5. `E removeFirst()`
6. `E removeLast()`
六、并发修改异常
1、异常原因
遍历时修改了集合元素长度
List<String> list = new ArrayList<String>();
Iterator<String> it = list.iterator();
while(it.hasNext()){String s = it.next();if(s.equals("world")){list.add("javaee");}
}
2、修改办法
(1)不用迭代器,用for循环索引元素
List<String> list = new ArrayList<String>();
for(int i = 0; i < list.size(); i++){String s = list.get(i);if(s.equals("world")){list.add("javaee");}
}
(2)用列表迭代器添加元素
List<String> list = new ArrayList<String>();
ListIterator<String> it = list.listiterator();
while(it.hasNext()){String s = it.next();if(s.equals("world")){it.add("javaee");}
}
七、增强for
增强for循环:简化数组和Collection集合的遍历
- 实现Iterable接口的类允许其对象成为增强型for循环的目标
- 原理是Iterator迭代器 --> 会触发“并发修改异常”
for(元素数据类型 变量名 : 数组/Collection集合){//变量就是元素
}//示例
int[] arr = {1,2,3,4,5};
for(int i : arr){sout(i);
}
八、Set及其子类
1、Set
- 不包含重复元素
- 没有索引,不能用普通for循环遍历
- 迭代顺序随机
2、HashSet
(1)哈希值
1. 根据对象的地址/字符串/数字算出来的int类型的数值
2. `public int hashCode`
1. 返回对象的哈希值
2. Object类
(2)HashSet概述
1. 底层为哈希表(HashMap)
2. 迭代顺序无保障
3. 没有索引,不能用不同for循环遍历
4. Set集合没有重复元素 --> **需要重写对象的hashCode与equal方法**
(3)HashSet存储特点
- 比较方法 - 哈希值
- equals
 
- 结构:数组 + 链表 - 元素位置:“hashCode % 位置”
- 相同位置的元素通过链表形式连接
 
3、LinkedHashSet
- 底层:链表 + 哈希表
- 可预测的迭代次序
- HashSet集合没有重复元素
4、TreeSet
- 元素有序
- 自然排序:无参构造TreeSet()
- 比较器排序:带参构造TreeSet(Comparator comparator)
- 存储引用类/包装类类型
自然排序 --> 重写compareTo方法
@Override
public int compareTo(Stu s){return this.age - s.age == 0 ? this.name.compareTo(s.name) : this.age - s.age;
}
比较器排序 --> 匿名内部类
TreeSet<Stu> ts = new TreeSet<>(new Comparator<Stu>(){@Overridepublic int compare(Stu s1, Stu s2){return s1.getAge() - s2.getAge() == 0 ? s1.getName().compareTo(s2.getName()) : s1.getAge() - s2.getAge();}
});
九、泛型
1、泛型概述
- 将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型
- 本质:参数化类型
- 实参类型只能是引用数据类型
- 泛型定义格式
- <类型>
- <类型1, 类型2…>
2、泛型类定义格式
- 修饰符 class 类名<类型>{...}
- 类型可以是随便写的任意标识 - T:type
- E:element
- K:key
- V:value
 
3、泛型方法
- 泛型方法 --> 不限制类型的万金油
- 泛型方法定义格式 --> 修饰符 <类型> 返回值类型 方法名(类型 变量名){...}
4、泛型接口
修饰符 interface 接口名<类型>{...}
5、类型通配符
- 类型通配符:<?>
- 表示各种泛类List的父类
- 元素可以匹配任何类型
- 不能添加元素
- 类型通配符的上限:<? extends 类型>
- 表示此类型及其子类
- 类型通配符的下限:<? super 类型>
- 表示此类型及其父类
6、可变参数
(1)可变参数的定义格式
修饰符 返回值类型 方法名(数据类型...变量名){}
public static int sum(int...a){int sum = 0;for(int i : a){sum += i;}return sum;
}
(2)特点
- 变量其实是数组
- 多个参数要把可变参数放最后
(3)可变参数的应用
1. Arrays工具类的静态方法
// 定义
public static <T> List<T> asList(T...a)
// 使用
List<String> list = Arrays.asList("wc","wmh");
返回有指定数组支持的固定大小的列表 --> 不能增删可以改
2. List接口的静态方法
// 定义
public static <E> List<E> of(E...elements)
// 使用
List<String> list = List.of("wc","wmh");
返回包含任意数量元素的不可变列表 --> 不能增删改
3. Set接口的静态方法
// 定义
public static <E> Set<E> of(E...elements)
// 使用
Set<String> s = Set.of("wc","wmh");
返回一个包含任意数量元素的不可变集合 --> 不能增删改
十、Map
1、概述
Interface Map<K, V> 
K:键 V:值
将key映射到value的对象
key不可以重复 && 每个key只对应一个value
2、创建Map集合的方式
多态
3、具体实现类:HashMap
-  添加元素: V put(K key, V value)
-  删除: V remove(Object key)
-  清空: void clear()
-  判键存在: boolean containsKey(Object key)
-  判值存在: boolean containsValue(Object key)
-  判空: boolean isEmpty()
-  集合长度: int size()
-  Map的获取方法 
-  根据键获取值 
```java
// 定义
V get(Object key)
// 使用
Map<String,String> map = new Map<>();
map.put("1","wmh");
sout(map.get("1"));
```
- 获取所有键的集合
```java
// 定义
Set<K> keySet()
// 使用
Set<String> keySet = map.keySet();
for(String key : keySet){sout(key);
}
```
- 获取所有值的集合
```java
// 定义
Collection<V> values()
// 使用
Collection<String> values = map.values();
for(String value : values){sout(value);
}
```
- 获取所有键值对对象的集合
```java
// 定义
Set<Map.Entry<K, V>> entrySet()
// 使用
Set<Map.Entry<String,String>> entrySet = map.entrySet();
for(Map.Entry<String,String> me : entrySet){sout(me.getKey() + "," + me.getValue());
}
```
- Map集合的遍历
// 方式1
Set<String> keySet = map.keySet();
for(String key : keySet){sout(key + "," + map.get(key));
}
// 方式2
Set<Map.Entry<String,String>> entrySet = map.entrySet();
for(Map.Entry<String,String> me : entrySet){sout(me.getKey() + "," + me.getValue());
}
十一、Collections工具类
常用方法(类要重写compareTo方法)
1、列表升序排列
// 定义
public static <T extends Comparable<? superT>> void sort(List<T> list)
// 使用:普通集合
Collections.sort(list);
// 使用:类的集合 --> 比较器排序 --> 匿名内部类/类内重写
ArrayList<Stu> array = new ArrayList<>();
Collections.sort(array, new Comparator<Stu>(){@Overridepublic int compare(Stu s1, Stu s2){return s1.getAge() - s2.getAge() == 0 ? s1.getName().compareTo(s2.getName()) : s1.getAge() - s2.getAge();}
});
2、反转列表顺序
// 定义
public static void reverse(List<?> list)
// 使用
Collections.reverse(list);
3、列表随机排列
// 定义
public static void reverse(List<?> list)
// 使用
Collections.reverse(list);
相关文章:
【JavaSE】集合(学习笔记)
一、数据结构 1、栈 压栈 / 弹栈栈顶元素、栈底元素先进后出 2、队列 入队列 / 出队列前端、后端先进先出 3、数组 查询效率高,增删效率低 4、链表 查询效率低(必须从头找),增删效率高 5、哈希表 比较方法哈希值equals结构:数组 链…...
 
Mybatis 的简单运用介绍
Mybatis 用于操作数据库 操作数据库肯定需要: 1.SQL语句 2.数据库对象和 java 对象的映射 接下来我们看看怎么使用 Mybatis 我们先搞一些数据库内容 然后将其这些内容和Java对象进行映射 再创建一个类实现 select * from 再写一个类证明上述代码是否可以实现 别忘了在appli…...
python的itertools库
itertools常用的方法如下: import itertools 1. 生成的列表累加,在生成新的列表x itertools.accumulate(range(10))print(list(x))结果:[0, 1, 3, 6, 10, 15, 21, 28, 36, 45] 2. 连接多个列表或者迭代器x itertools.chain(range(3), rang…...
 
STM32/GD32_分散加载
Q:如何将一个变量、某个源文件的函数在编译阶段就存储在用户指定的区域? KEIL环境:.map后缀文件、.sct后缀文件 IAR环境:.map后缀文件、.icf后缀文件 【map文件】 对固件里面的变量、函数、常量等元素的存储空间进行分配的说明…...
go clean
移除目标文件和缓存文件。 更多信息:https://golang.org/cmd/go/#hdr-Remove_object_files_and_cached_files. 只打印移除命令,而不会真正移除任何东西: go clean -n 删除编译缓存: go clean -cache 删除所有测试结果缓存&…...
 
BUUCTF [ACTF新生赛2020]swp 1
BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 密文: 下载附件,得到一个.tar文件。 解题思路: 1、使用WinRAR解压.tar文件,得到两个.zip文件。 解压wget.zip文件,得…...
【PTA题目】7-4 缩写期刊名 分数 10
7-4 缩写期刊名 分数 10 全屏浏览题目 切换布局 作者 黄龙军 单位 绍兴文理学院 科研工作者经常要向不同的期刊投稿。但不同期刊的参考文献的格式往往各不相同。有些期刊要求参考文献所发表的期刊名必须采用缩写形式,否则直接拒稿。现对于给定的期刊名ÿ…...
 
什么是 TLS/SSL 握手
TLS/SSL 握手是一个加密过程,每当客户端(如浏览器)与服务器建立连接时,都会在后台进行,此握手协议有助于客户端和服务器之间的安全连接,从而促进隐私、数据完整性和机密性。 TLS/SSL 握手何时发生 每当客…...
 
和鲸科技与国科环宇建立战略合作伙伴关系,以软硬件一体化解决方案促进科技创新
近日,在国科环宇土星云算力服务器产品发布会暨合作伙伴年度会上,和鲸科技与国科环宇正式完成战略伙伴签约仪式,宣布达成战略合作伙伴关系。未来,双方将深化合作,充分发挥在产品和市场方面的互补优势,为企事…...
 
[C++]六大默认成员函数详解
☃️个人主页:fighting小泽 🌸作者简介:目前正在学习C和Linux 🌼博客专栏:C入门 🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻 …...
 
组合(回溯算法)
77. 组合 - 力扣(LeetCode) 题目描述 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 样例输入 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],…...
 
力扣:1419. 数青蛙
题目: 代码: class Solution { public:int minNumberOfFrogs(string croakOfFrogs){string s "croak";int ns.size();//首先创建一个哈希表来标明每个元素出现的次数!vector<int>hash(n); //不用真的创建一个hash表用一个数…...
 
java_springboot企业人事考勤请假管理信息系统rsglxx+jsp
(1)熟练掌握Java开发的原理和方法 (2)熟练学习掌握SSM框架 (3)熟悉软件开发的流程 (4)了解中内外互联网中所主流的技术 (5)深层次的了解计算机学科领域的知识…...
 
java项目之木里风景文化管理平台(ssm+vue)
项目简介 木里风景文化管理平台实现了以下功能: 前台功能:用户进入系统可以实现首页,旅游公告,景区,景区商品,景区美食,旅游交通工具,红黑榜,个人中心,后台…...
 
源码安装mysql
使用源码安装mysql,这里选择的版本是mysql5.7.35 ,系统是Centos7.6 官网下载地址:https://downloads.mysql.com/archives/community/ 下载源码压缩包 [rootlocalhost ~]# cd /opt[rootlocalhost opt]# wget https://downloads.mysql.com/archives/get/…...
 
注解方式优雅的实现Redisson分布式锁
1.前言 随着微服务的快速推进,分布式架构也得到蓬勃的发展,那么如何保证多进程之间的并发则成为需要考虑的问题。因为服务是分布式部署模式,本地锁Reentrantlock和Synchnorized就无法使用了,当然很多同学脱口而出的基于Redis的se…...
 
服务器安装JDK17 版本显示JDK8
服务器之前安装的是JDK8,后面升级JDK17后,发现执行 java -vsrsion 显示的是此时我的环境变量已经换成了JAVA17的路径 输入: vim /etc/profile 解决办法: 1.更新自己环境变量 bash export JAVA_HOME/usr/local/jdk-17.0.7 …...
 
利用MCMC 获得泊松分布
写出概率流方程如下 if state 0: if np.random.random() < min([Lambda/2, 1]):state 1else:passelif state 1:if choose_prob_state[i] < 0.5:#选择 1 -> 0,此时的接受概率为min[2/Lambda, 1]if np.random.random() < min([2/Lambda, 1]…...
 
docker-compose脚本编写及常用命令
安装 linux DOCKER_CONFIG/usr/local/lib/docker/cli-plugins sudo mkdir -p $DOCKER_CONFIG/cli-plugins sudo curl -SL https://521github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose sudo c…...
编译企业微信会话内容存档PHP版SDK扩展
1.下载SDK 如果克隆不了,就页面下载 git clone https://github.com/pangdahua/php7-wxwork-finance-sdk2.下载企微官网C版本的最新sdk文件 下载地址:https://wwcdn.weixin.qq.com/node/wework/images/sdk_20201116.rar 下载以后将解压之后的文件夹里l…...
 
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
 
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
 
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了  先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
 
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
 
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
