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() 方法在将集合转换为数组时,会根据集合长度和传入数组的长度进行智能判断:

  • 场景一:集合长度 > 数组长度
    • 数据在传入的数组中放不下,此时方法会根据集合的实际大小,重新创建一个新的数组来存放数据。
  • 场景二:集合长度 ≤ 数组长度
    • 数据在传入的数组中放得下,此时方法不会创建新数组,而是直接使用传入的数组来存放数据,从而节省内存开销。
相关推荐
Lee川9 小时前
深度解构JavaScript:作用域链与闭包的内存全景图
javascript·面试
_Eleven10 小时前
Pinia vs Vuex 深度解析与完整实战指南
前端·javascript·vue.js
技术狂小子10 小时前
# 一个 Binder 通信中的多线程同步问题
javascript·vue.js
进击的尘埃10 小时前
Service Worker + stale-while-revalidate:让页面"假装"秒开的那些事
javascript
秋水无痕10 小时前
从零搭建个人博客系统:Spring Boot 多模块实践详解
前端·javascript·后端
进击的尘埃10 小时前
基于 Claude Streaming API 的多轮对话组件设计:状态机与流式渲染那些事
javascript
juejin_cn11 小时前
[转][译] 从零开始构建 OpenClaw — 第六部分(持久化记忆)
javascript
juejin_cn11 小时前
[转][译] 从零开始构建 OpenClaw — 第七部分(子智能体系统)
javascript
an3174212 小时前
解决 VSCode 中 ESLint 格式化不生效问题:新手也能看懂的配置指南
前端·javascript·vue.js
Lee川14 小时前
🚀《JavaScript 灵魂深处:从 V8 引擎的“双轨并行”看执行上下文的演进之路》
javascript·面试