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

  • 场景一:集合长度 > 数组长度
    • 数据在传入的数组中放不下,此时方法会根据集合的实际大小,重新创建一个新的数组来存放数据。
  • 场景二:集合长度 ≤ 数组长度
    • 数据在传入的数组中放得下,此时方法不会创建新数组,而是直接使用传入的数组来存放数据,从而节省内存开销。
相关推荐
skywalk816313 小时前
g4f提供的模型调用:python JavaScript和curl
前端·javascript·vue.js·g4f
无限进步_13 小时前
二叉树的中序遍历(非递归实现)
开发语言·数据结构·c++·windows·算法·visual studio
计算机安禾13 小时前
【数据结构与算法】第48篇:算法思想(三):贪心算法
c语言·开发语言·数据结构·算法·贪心算法·代理模式·图论
csbysj202014 小时前
Java 正则表达式
开发语言
西西学代码14 小时前
FlutterBluePlus
windows
小明的IT世界14 小时前
编程智能体为何能让LLM在实际工作中表现更好
java·开发语言·人工智能·ai编程
.柒宇.14 小时前
Java八股之== 与 equals 区别
java·开发语言
浪客川14 小时前
【百例RUST - 011】简单键值对
开发语言·后端·rust
未名编程14 小时前
React Native WebView 加载远程页面显示错误内容的深层原因及解决方案
javascript·react native·react.js
书中有颜如玉14 小时前
Kotlin Coroutines 异步编程实战:从原理到生产级应用
android·开发语言·kotlin