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

  • 场景一:集合长度 > 数组长度
    • 数据在传入的数组中放不下,此时方法会根据集合的实际大小,重新创建一个新的数组来存放数据。
  • 场景二:集合长度 ≤ 数组长度
    • 数据在传入的数组中放得下,此时方法不会创建新数组,而是直接使用传入的数组来存放数据,从而节省内存开销。
相关推荐
weilaieqi18 分钟前
行业前列!CASAMANIA HORM富森美高端意式沙发标杆
开发语言
小雪_Snow12 分钟前
JS 数组的遍历 —— 两种方式详解
前端·javascript
小二·31 分钟前
WebGPU 浏览器端跑大模型:让AI在网页里跑起来(WebLLM/Transformers.js实战)
开发语言·javascript·人工智能
小猴子爱上树36 分钟前
Temu批量视频翻译Python实现方案
开发语言·python·音视频
心中有国也有家42 分钟前
AtomGit Flutter 鸿蒙客户端:零外部资源的应用打包策略
android·javascript·flutter·华为·harmonyos
IDIOSF1 小时前
R语言 下载安装教程(附安装包)R语言4.5安装步骤(保姆级)
开发语言·其他·r语言
乱七八糟的屋子1 小时前
LibYAML超全教程-C语言YAML解析与生成
c语言·开发语言·配置文件·yaml解析·libyaml·开源库实战
paopaokaka_luck1 小时前
基于Springboot3+Vue3的宠物殡葬管理系统(webSocket实时通讯、接入腾讯地图、支付宝沙盒支付、Echarts图形化分析)
java·开发语言·网络·后端
逝水无殇1 小时前
HTML 元素详解
开发语言·前端·html
Lhappy嘻嘻1 小时前
网络初识|基础入门:局域网广域网、IP 端口、TCP/IP 五层模型与封装解封装全过程
java·开发语言·网络·笔记·网络协议·tcp/ip