js-20

一、Collections 工具类

1. 核心定位

java.util.Collections 是一个集合工具类,而非集合本身,它提供了一系列静态方法,用于对集合进行操作和处理。

2. 常用 API

表格

方法名 说明
public static <T> boolean addAll(Collection<T> c, T... elements) 批量添加元素到集合中
public static void shuffle(List<?> list) 打乱 List 集合中元素的顺序
public static <T> void sort(List<T> list) 根据自然排序对 List 进行排序
public static <T> void sort(List<T> list, Comparator<T> c) 根据指定比较器对 List 进行排序
public static <T> int binarySearch(List<T> list, T key) 在有序 List 中以二分查找法查找元素
public static <T> void copy(List<T> dest, List<T> src) 将源集合元素拷贝到目标集合
public static <T> int fill(List<T> list, T obj) 使用指定元素填充整个集合
public static <T> T max/min(Collection<T> coll) 根据自然排序获取集合中的最大 / 最小值
public static <T> void swap(List<?> list, int i, int j) 交换集合中指定索引位置的两个元素

二、可变参数

1. 核心特性

  • 本质:可变参数本质上就是一个数组。
  • 作用:在方法形参中接收同类型的多个数据,使方法调用更灵活。
  • 格式数据类型... 参数名,例如 int... a

2. 注意事项

  • 一个方法的形参列表中,可变参数只能有一个
  • 可变参数必须放在形参列表的最后面

三、不可变集合

1. 核心定义

不可变集合是指创建后不能被修改的集合,即不能进行添加、删除或修改元素的操作。

2. 创建方式

ListSetMap 接口中,都提供了静态的 of() 方法,用于创建不可变集合:

表格

方法名 说明
static <E> List<E> of(E... elements) 创建一个包含指定元素的不可变 List 集合
static <E> Set<E> of(E... elements) 创建一个包含指定元素的不可变 Set 集合
static <K, V> Map<K, V> of(K k1, V v1, ...) 创建一个包含指定键值对的不可变 Map 集合

3. 注意事项

  • 创建后的集合不能添加、删除或修改任何元素。
  • 当创建不可变 SetMap 集合时,传入的参数(键)必须保证唯一性,否则会抛出异常。

四、创建不可变 Map 的两种方式

1. 传统方式:Map.ofEntries()

java

运行

复制代码
Map<Object, Object> map = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
  • 原理
    1. 先通过 hm.entrySet() 获取原 Map 的所有键值对(Entry 对象)。
    2. 调用 toArray(new Map.Entry[0])Set<Entry> 转换为 Entry 数组。
    3. 最后使用 Map.ofEntries() 方法,将数组中的所有 Entry 转换为一个新的不可变 Map。

2. 简化方式:Map.copyOf()(Java 10+)

java

运行

复制代码
Map<String, String> map = Map.copyOf(hm);
  • 原理 :这是一个更简洁的静态方法,它直接接收一个现有的 Map hm,并返回一个包含其所有键值对的不可变副本。

五、创建不可变 Map 的关键细节

  1. 键的唯一性 :不可变 Map 的键(Key)不能重复,必须保证唯一性,否则创建时会抛出 IllegalArgumentException 异常。
  2. Map.of() 的参数限制 :直接使用 Map.of() 方法创建不可变 Map 时,参数个数有上限,最多只能传递 20 个参数(即 10 个键值对) 。当键值对数量超过 10 个时,应使用 Map.ofEntries()Map.copyOf() 方法。

六、toArray() 方法的底层原理

toArray() 方法在将集合转换为数组时,会根据集合长度和传入数组的长度进行智能判断:

  • 场景一:集合长度 > 数组长度
    • 数据在传入的数组中放不下,此时方法会根据集合的实际大小,重新创建一个新的数组来存放数据。
  • 场景二:集合长度 ≤ 数组长度
    • 数据在传入的数组中放得下,此时方法不会创建新数组,而是直接使用传入的数组来存放数据,从而节省内存开销。
相关推荐
Project_Observer1 小时前
Zoho Projects自动化:状态变更时自动创建依赖任务
linux·数据库·windows
sheji34161 小时前
【开题答辩全过程】以 基于Java的甜品蛋糕网上商城的设计与实现为例,包含答辩的问题和答案
java·开发语言
智能零售小白白1 小时前
零售多门店库存调拨优化:需求预测与路径规划的技术实现
java·开发语言·零售
前路不黑暗@2 小时前
Java项目:Java脚手架项目的意义和环境搭建(一)
java·开发语言·spring boot·学习·spring cloud·maven·idea
@––––––2 小时前
力扣hot100—系列8-回溯算法
javascript·算法·leetcode
phltxy2 小时前
Vue核心进阶:v-model深度解析+ref+nextTick实战
前端·javascript·vue.js
光泽雨2 小时前
C#库文件调用逻辑
开发语言·c#
三小河2 小时前
React 样式——styled-components
前端·javascript·后端
C++ 老炮儿的技术栈2 小时前
万物皆文件:Linux 抽象哲学的开发之美
c语言·开发语言·c++·qt·算法