Part 1
将 List 转为 Integer 数组
nums.toArray(Integer[]::new)
具体逻辑:
List.toArray() 方法的作用
功能:
将 List 集合转换为数组。
参数:
- 可传入一个指定类型的空数组,用于确定返回数组的类型和长度。
- 若传入的数组长度 足够容纳列表元素,则直接填充元素并返回该数组;
- 若长度不足,会创建一个 新的同类型数组(长度为列表实际元素个数),填充后返回。
Integer[]::new 的含义
- 构造方法引用: Integer[]::new 是 Java 8 引入的 方法引用 语法,等价于创建一个 Integer 数组的构造器。
- 示例:若 nums 有 5 个元素, toArray(Integer[]::new) 会返回长度为 5 的 Integer[] 。
思考:
为什么不用原始类型数组?
- 泛型限制:Java 泛型不支持基本类型(如 int[] ), List 只能转为包装类型数组( Integer[] )。
等价的传统写法(无方法引用)
Integer[] a = new Integer[nums.size()];
// 先创建同长度空数组
nums.toArray(a);
// 填充元素,返回的 a 即为目标数组
- toArray(Integer[]::new) 是上述逻辑的 简化写法,更简洁高效。
总结:
这行代码的核心是利用 toArray 方法的参数特性,通过构造方法引用直接生成 Integer 数组,避免手动创建数组和类型转换的繁琐步骤,同时提升后续元素访问的效率。
merge与传统put
方法原型:
default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
代码示例:
cnt.merge(a[i], 1, Integer::sum); // 统计次数:存在则加 1,不存在则初始化为 1
参数说明:
a[i]
- 这是要统计的键(key),也就是你要计数的元素1
- 这是如果键不存在时要关联的初始值Integer::sum
- 这是一个合并函数(lambda表达式),当键已存在时,会用这个函数计算新值
工作原理:
-
如果
a[i]
这个键不存在于cnt
中:- 会直接插入这个键,并将值设为
1
(第二个参数)
- 会直接插入这个键,并将值设为
-
如果
a[i]
这个键已经存在:- 会取出旧值(oldValue)和给定的
1
(第二个参数) - 使用
Integer::sum
函数计算新值(即oldValue + 1
) - 用新值更新这个键值对
- 会取出旧值(oldValue)和给定的
等价于:
// 传统写法
if (cnt.containsKey(a[i])) {
cnt.put(a[i], cnt.get(a[i]) + 1);
} else {
cnt.put(a[i], 1<