江苏华江建设集团网站网站建设 的公
web/
2025/10/1 4:35:10/
文章来源:
江苏华江建设集团网站,网站建设 的公,还有哪些网站可以做淘宝活动,化妆品网站后台Java 9集合工厂方法#xff1a;用List.of、Set.of、Map.of创建安全不可变集合
Java 9引入了革命性的集合工厂方法List.of、Set.of和Map.of#xff0c;彻底改变了开发者创建小型不可变集合的方式。这些方法不仅语法简洁#xff0c;还在安全性和性能上实现了质的飞跃。本文将…Java 9集合工厂方法用List.of、Set.of、Map.of创建安全不可变集合
Java 9引入了革命性的集合工厂方法List.of、Set.of和Map.of彻底改变了开发者创建小型不可变集合的方式。这些方法不仅语法简洁还在安全性和性能上实现了质的飞跃。本文将深入解析这些工厂方法的核心特性并通过对比传统方式展示其在实际开发中的优势。 一、新工厂方法概览
1. 方法家族
方法签名说明示例List.of(E... elements)创建不可变ListListString list List.of(A, B);Set.of(E... elements)创建不可变Set元素唯一SetInteger set Set.of(1, 2, 3);Map.of(K k1, V v1, ...)创建不可变Map最多10个键值对MapString, Integer map Map.of(a, 1, b, 2);Map.ofEntries(Map.Entry...)创建任意数量键值对的MapMap.ofEntries(entry(a, 1), entry(b, 2)) 二、核心优势
1. 真正不可变性vs 伪不可变
传统方式的问题
// Java 8的不可变集合
ListString oldList Collections.unmodifiableList(new ArrayList(Arrays.asList(A, B))
);
oldList.add(C); // 运行时抛出UnsupportedOperationException新方式
ListString newList List.of(A, B);
newList.add(C); // 编译期即可通过IDE提示发现问题特性新工厂方法Collections.unmodifiableList编译期类型检查✅ 直接拒绝修改操作❌ 运行时异常防御原集合修改✅ 完全独立❌ 包装集合仍受原集合影响
2. 空值安全Null Safety
List.of(A, null); // 立即抛出NullPointerException
Set.of(null); // 同上
Map.of(key, null);// 值也不能为null设计哲学在集合创建时严格拒绝null避免后续NPE隐患。
3. 元素唯一性保证针对Set/Map
Set.of(1, 1); // 直接抛出IllegalArgumentException
Map.of(a, 1, a, 2); // 键重复抛出异常4. 性能优化
JVM针对工厂方法返回的集合做了深度优化
内存占用比new ArrayList节省约30%内存迭代速度比传统集合快2-3倍得益于紧凑存储哈希计算Set.of/Map.of在创建时预计算哈希值 三、与传统方式对比
1. 创建不可变List
Java 8方式
ListString list Collections.unmodifiableList(new ArrayList(Arrays.asList(A, B))
);
// 需要两层包装内存开销大Java 9方式
ListString list List.of(A, B);
// 直接返回优化后的不可变实例2. 创建不可变Set
传统方式
SetInteger set Collections.unmodifiableSet(new HashSet(Arrays.asList(1, 2, 3))
);
// 无法保证初始化时的元素唯一性新方式
SetInteger set Set.of(1, 2, 3);
// 自动检查元素唯一性发现重复立即报错3. 创建不可变Map
传统方式
MapString, Integer tempMap new HashMap();
tempMap.put(a, 1);
tempMap.put(b, 2);
MapString, Integer map Collections.unmodifiableMap(tempMap);
// 需要中间变量存在竞态条件风险新方式
MapString, Integer map Map.of(a, 1, b, 2);
// 线程安全无中间状态四、使用注意事项
1. 元素限制
数量限制Map.of最多接受10个键值对超过需用Map.ofEntries类型限制不支持基本类型需用包装类List.of(1, 2, 3); // 正确自动装箱
List.of(new int[]{1}); // 错误实际类型为Listint[]2. 防御性编程
// 接收外部集合时创建防御副本
void process(ListString input) {ListString safeList List.copyOf(input); // Java 10// 或 ListString safeList List.of(input.toArray());
}3. 与Stream API结合
// 过滤后生成不可变集合
ListString filtered Stream.of(A, B, C).filter(s - s.length() 1).collect(Collectors.toUnmodifiableList());五、最佳实践场景
1. 配置参数存储
private static final SetString VALID_STATUSES Set.of(NEW, PROCESSING, COMPLETED);2. 测试数据构造
Test
void testSort() {ListInteger numbers List.of(3, 1, 4);Collections.sort(numbers); // 立即抛出UnsupportedOperationException
}3. 返回值保护
public ListEmployee getEmployees() {return List.copyOf(internalList); // 返回不可变副本
}六、常见问题解答
Q1为什么需要新的工厂方法
类型安全编译时即可发现修改操作性能优势专用实现比通用集合更高效语义清晰明确表达不可变意图
Q2如何创建空集合
ListString emptyList List.of(); // 空集合单例
SetInteger emptySet Set.of();
MapString, String emptyMap Map.of();Q3与Arrays.asList的区别
特性List.ofArrays.asList可变性完全不可变半可变可set不可add空值支持❌ 禁止null✅ 允许null与原数组关联❌ 独立存储✅ 共享底层数组内存占用优化后的紧凑结构包装器数组引用 七、总结
使用新工厂方法的三大理由
️ 安全性杜绝意外修改强化空值约束 性能专为不可变场景优化内存效率更高✨ 简洁性一行代码表达创建不可变集合的意图
适用原则
优先用于静态配置数据推荐作为方法返回值防止外部修改适合存储需要确保完整性的业务数据
迁移建议
逐步替换项目中Collections.unmodifiableXXX的用法在单元测试中优先采用新语法注意检查历史代码中的null值使用
Java 9的集合工厂方法不仅是语法糖更是工程实践的重要进步。合理运用这些特性可以让代码更健壮、更高效同时降低维护成本。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84850.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!