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

传统算法:使用 Pygame 实现K-Means 聚类算法
使用 Pygame 模块演示了 K-Means 聚类算法的基本原理。让我逐步解释它的实现: 初始化和基本设置 Pygame 初始化: 通过 pygame.init() 初始化 Pygame。 定义颜色和屏幕大小: 定义了一些颜色常量(WHITE, BLACK, RED, GREEN, BLUE)和屏幕的宽度和高度。 创建 Pygame 窗口:…...

WebUI工作流插件超越ComfyUI
在AI绘画领域,Stable Diffsion是最受欢迎的,因为它是开源软件。 开源有两大优势,一是免费,二是适合折腾。 大量的开发者、爱好者投入无尽的热情,来推动Stable Diffsion的快速发展。 在图形界面方面,WebU…...

Docker容器化平台及其优势和应用场景介绍
Docker是一种开源的容器化平台,它基于操作系统级别虚拟化技术,可以将应用程序及其依赖项打包成一个独立的容器,提供轻量级、一致性、可移植性的应用环境。Docker的基本概念和优势如下: 镜像(Image):Docker容器的基础&…...

Hive:从HDFS回收站恢复被删的表
场景 一张手工维护的内部表,本来排查没有使用,然后删掉了,发现又需要使用,只能恢复这张表了。 1.确认HDFS是否开启回收站功能 2.查看回收站中的数据 被删除的数据会放在删除数据时使用的用户目录下,如:使…...

TZOJ 1387 人见人爱A+B
答案: #include <stdio.h> void time(int ah, int am, int as, int bh, int bm, int bs, int* sum_h, int* sum_m, int* sum_s) //不需要返回值所以定义void函数,前面6个为输入,然后用指针存给后面三个 {*sum_s (as bs) % 60; …...

校园圈子系统丨交友丨地图找伴丨二手市场等功能丨源码交付支持二开丨APP小程序H5三端交付!
校园圈子系统是一款专为校园生活设计的智能应用,拥有丰富多样的功能模块,提供全方位的服务。无论您是师生还是校友,我们都为您打造了一个与校园紧密相连的交流平台。 通过校园圈子系统,您可以方便地浏览校内最新动态,包…...

java操作windows系统功能案例(一)
下面是一个Java操作Windows系统功能的简单案例: 获取系统信息: import java.util.Properties;public class SystemInfo {public static void main(String[] args) {Properties properties System.getProperties();properties.list(System.out);} }该程…...

【双向链表的实现】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1. 双向链表的结构 2. 双向链表的实现 2.1 头文件 ——双向链表的创建及功能函数的定义 2.2 源文件 ——双向链表的功能函数的实现 2.3 源文件 ——双向链表功能的…...

中台战略思想与架构总结
中台战略思想与架构总结 在2015年年中,马云带领阿里高管,拜访了游戏公司Supercell,以《部落战争》《海岛奇兵》《卡通农场》等游戏知名。 Supercell是一家典型的以小团队模式进行游戏开发的公司,一般来说两个员工,或…...

VUE2+THREE.JS点击事件
THREE.JS点击事件 1.增加监听点击事件2.点击事件实现3.记得关闭页面时 销毁此监听事件 1.增加监听点击事件 renderer.domElement.addEventListener("click", this.onClick, false); 注:初始化render时监听 2.点击事件实现 onClick(event) {const raycaster new …...