当前位置: 首页 > news >正文

【JavaSE】集合(学习笔记)

一、数据结构

1、栈

  1. 压栈 / 弹栈
  2. 栈顶元素、栈底元素
  3. 先进后出

2、队列

  1. 入队列 / 出队列
  2. 前端、后端
  3. 先进先出

3、数组

查询效率高,增删效率低

4、链表

查询效率低(必须从头找),增删效率高

5、哈希表

  1. 比较方法
  2. 哈希值
  3. equals
  4. 结构:数组 + 链表
  5. 元素位置:“hashCode % 位置”
  6. 相同位置的元素通过链表形式连接

二、集合类体系结构

  1. Collection:单列
    1. List:可重复
      1. ArrayList
      2. LinkedList
    2. Set:不可重复
      1. HashSet
      2. TreeSet
  2. Map:双列
    1. 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集合的遍历

  1. 实现Iterable接口的类允许其对象成为增强型for循环的目标
  2. 原理是Iterator迭代器 --> 会触发“并发修改异常”
for(元素数据类型 变量名 : 数组/Collection集合){//变量就是元素
}//示例
int[] arr = {1,2,3,4,5};
for(int i : arr){sout(i);
}

八、Set及其子类

1、Set

  1. 不包含重复元素
  2. 没有索引,不能用普通for循环遍历
  3. 迭代顺序随机

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存储特点
  1. 比较方法
    1. 哈希值
    2. equals
  2. 结构:数组 + 链表
    1. 元素位置:“hashCode % 位置”
    2. 相同位置的元素通过链表形式连接

3、LinkedHashSet

  1. 底层:链表 + 哈希表
  2. 可预测的迭代次序
  3. HashSet集合没有重复元素

4、TreeSet

  1. 元素有序
  2. 自然排序:无参构造TreeSet()
  3. 比较器排序:带参构造TreeSet(Comparator comparator)
  4. 存储引用类/包装类类型

自然排序 --> 重写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. 本质:参数化类型
  3. 实参类型只能是引用数据类型
  4. 泛型定义格式
  5. <类型>
  6. <类型1, 类型2…>

2、泛型类定义格式

  1. 修饰符 class 类名<类型>{...}
  2. 类型可以是随便写的任意标识
    1. T:type
    2. E:element
    3. K:key
    4. V:value

3、泛型方法

  1. 泛型方法 --> 不限制类型的万金油
  2. 泛型方法定义格式 --> 修饰符 <类型> 返回值类型 方法名(类型 变量名){...}

4、泛型接口

修饰符 interface 接口名<类型>{...}

5、类型通配符

  1. 类型通配符:<?>
  2. 表示各种泛类List的父类
  3. 元素可以匹配任何类型
  4. 不能添加元素
  5. 类型通配符的上限:<? extends 类型>
  6. 表示此类型及其子类
  7. 类型通配符的下限:<? super 类型>
  8. 表示此类型及其父类

6、可变参数

(1)可变参数的定义格式

修饰符 返回值类型 方法名(数据类型...变量名){}

public static int sum(int...a){int sum = 0;for(int i : a){sum += i;}return sum;
}
(2)特点
  1. 变量其实是数组
  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

  1. 添加元素:V put(K key, V value)

  2. 删除:V remove(Object key)

  3. 清空:void clear()

  4. 判键存在:boolean containsKey(Object key)

  5. 判值存在:boolean containsValue(Object key)

  6. 判空:boolean isEmpty()

  7. 集合长度:int size()

  8. Map的获取方法

  9. 根据键获取值

```java
// 定义
V get(Object key)
// 使用
Map<String,String> map = new Map<>();
map.put("1","wmh");
sout(map.get("1"));
```
  1. 获取所有键的集合
```java
// 定义
Set<K> keySet()
// 使用
Set<String> keySet = map.keySet();
for(String key : keySet){sout(key);
}
```
  1. 获取所有值的集合
```java
// 定义
Collection<V> values()
// 使用
Collection<String> values = map.values();
for(String value : values){sout(value);
}
```
  1. 获取所有键值对对象的集合
```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());
}
```
  1. 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、数组 查询效率高&#xff0c;增删效率低 4、链表 查询效率低(必须从头找)&#xff0c;增删效率高 5、哈希表 比较方法哈希值equals结构&#xff1a;数组 链…...

Mybatis 的简单运用介绍

Mybatis 用于操作数据库 操作数据库肯定需要: 1.SQL语句 2.数据库对象和 java 对象的映射 接下来我们看看怎么使用 Mybatis 我们先搞一些数据库内容 然后将其这些内容和Java对象进行映射 再创建一个类实现 select * from 再写一个类证明上述代码是否可以实现 别忘了在appli…...

python的itertools库

itertools常用的方法如下&#xff1a; import itertools 1. 生成的列表累加&#xff0c;在生成新的列表x itertools.accumulate(range(10))print(list(x))结果&#xff1a;[0, 1, 3, 6, 10, 15, 21, 28, 36, 45] 2. 连接多个列表或者迭代器x itertools.chain(range(3), rang…...

STM32/GD32_分散加载

Q&#xff1a;如何将一个变量、某个源文件的函数在编译阶段就存储在用户指定的区域&#xff1f; KEIL环境&#xff1a;.map后缀文件、.sct后缀文件 IAR环境&#xff1a;.map后缀文件、.icf后缀文件 【map文件】 对固件里面的变量、函数、常量等元素的存储空间进行分配的说明…...

go clean

移除目标文件和缓存文件。 更多信息&#xff1a;https://golang.org/cmd/go/#hdr-Remove_object_files_and_cached_files. 只打印移除命令&#xff0c;而不会真正移除任何东西&#xff1a; go clean -n 删除编译缓存&#xff1a; go clean -cache 删除所有测试结果缓存&…...

BUUCTF [ACTF新生赛2020]swp 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。 密文&#xff1a; 下载附件&#xff0c;得到一个.tar文件。 解题思路&#xff1a; 1、使用WinRAR解压.tar文件&#xff0c;得到两个.zip文件。 解压wget.zip文件&#xff0c;得…...

【PTA题目】7-4 缩写期刊名 分数 10

7-4 缩写期刊名 分数 10 全屏浏览题目 切换布局 作者 黄龙军 单位 绍兴文理学院 科研工作者经常要向不同的期刊投稿。但不同期刊的参考文献的格式往往各不相同。有些期刊要求参考文献所发表的期刊名必须采用缩写形式&#xff0c;否则直接拒稿。现对于给定的期刊名&#xff…...

什么是 TLS/SSL 握手

TLS/SSL 握手是一个加密过程&#xff0c;每当客户端&#xff08;如浏览器&#xff09;与服务器建立连接时&#xff0c;都会在后台进行&#xff0c;此握手协议有助于客户端和服务器之间的安全连接&#xff0c;从而促进隐私、数据完整性和机密性。 TLS/SSL 握手何时发生 每当客…...

和鲸科技与国科环宇建立战略合作伙伴关系,以软硬件一体化解决方案促进科技创新

近日&#xff0c;在国科环宇土星云算力服务器产品发布会暨合作伙伴年度会上&#xff0c;和鲸科技与国科环宇正式完成战略伙伴签约仪式&#xff0c;宣布达成战略合作伙伴关系。未来&#xff0c;双方将深化合作&#xff0c;充分发挥在产品和市场方面的互补优势&#xff0c;为企事…...

[C++]六大默认成员函数详解

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C和Linux &#x1f33c;博客专栏&#xff1a;C入门 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&#x1f3fb; …...

组合(回溯算法)

77. 组合 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 样例输入 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],…...

力扣:1419. 数青蛙

题目&#xff1a; 代码&#xff1a; class Solution { public:int minNumberOfFrogs(string croakOfFrogs){string s "croak";int ns.size();//首先创建一个哈希表来标明每个元素出现的次数&#xff01;vector<int>hash(n); //不用真的创建一个hash表用一个数…...

java_springboot企业人事考勤请假管理信息系统rsglxx+jsp

&#xff08;1&#xff09;熟练掌握Java开发的原理和方法 &#xff08;2&#xff09;熟练学习掌握SSM框架 &#xff08;3&#xff09;熟悉软件开发的流程 &#xff08;4&#xff09;了解中内外互联网中所主流的技术 &#xff08;5&#xff09;深层次的了解计算机学科领域的知识…...

java项目之木里风景文化管理平台(ssm+vue)

项目简介 木里风景文化管理平台实现了以下功能&#xff1a; 前台功能&#xff1a;用户进入系统可以实现首页&#xff0c;旅游公告&#xff0c;景区&#xff0c;景区商品&#xff0c;景区美食&#xff0c;旅游交通工具&#xff0c;红黑榜&#xff0c;个人中心&#xff0c;后台…...

源码安装mysql

使用源码安装mysql&#xff0c;这里选择的版本是mysql5.7.35 ,系统是Centos7.6 官网下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 下载源码压缩包 [rootlocalhost ~]# cd /opt[rootlocalhost opt]# wget https://downloads.mysql.com/archives/get/…...

注解方式优雅的实现Redisson分布式锁

1.前言 随着微服务的快速推进&#xff0c;分布式架构也得到蓬勃的发展&#xff0c;那么如何保证多进程之间的并发则成为需要考虑的问题。因为服务是分布式部署模式&#xff0c;本地锁Reentrantlock和Synchnorized就无法使用了&#xff0c;当然很多同学脱口而出的基于Redis的se…...

服务器安装JDK17 版本显示JDK8

服务器之前安装的是JDK8&#xff0c;后面升级JDK17后&#xff0c;发现执行 java -vsrsion 显示的是此时我的环境变量已经换成了JAVA17的路径 输入&#xff1a; vim /etc/profile 解决办法&#xff1a; 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&#xff0c;此时的接受概率为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 如果克隆不了&#xff0c;就页面下载 git clone https://github.com/pangdahua/php7-wxwork-finance-sdk2.下载企微官网C版本的最新sdk文件 下载地址&#xff1a;https://wwcdn.weixin.qq.com/node/wework/images/sdk_20201116.rar 下载以后将解压之后的文件夹里l…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...