Java 11 对集合框架进行了增强,主要体现在引入了一些新的静态工厂方法,用于快速创建不可变集合。这些新方法使得集合的创建更加简洁和直观,尤其适合处理小型集合或需要不可变集合的场景。
以下是 Java 11 中集合增强的主要内容:
1. List.of()
用于创建一个不可变的 List
。
示例:
List<String> list = List.of("A", "B", "C");
System.out.println(list); // 输出:[A, B, C]
特点:
- 创建的列表是不可变的,任何修改操作(如
add()
、remove()
)都会抛出UnsupportedOperationException
。 - 不允许包含
null
元素,否则会抛出NullPointerException
。 - 性能更高,适用于只读的小型集合。
2. Set.of()
用于创建一个不可变的 Set
。
示例:
Set<String> set = Set.of("A", "B", "C");
System.out.println(set); // 输出:[A, B, C]
特点:
- 创建的集合是不可变的,任何修改操作(如
add()
、remove()
)都会抛出UnsupportedOperationException
。 - 不允许包含重复元素,否则会抛出
IllegalArgumentException
。 - 不允许包含
null
元素,否则会抛出NullPointerException
。
3. Map.of()
和 Map.ofEntries()
用于创建不可变的 Map
。
示例 1:使用 Map.of()
Map<String, Integer> map = Map.of("Alice", 25, "Bob", 30);
System.out.println(map); // 输出:{Alice=25, Bob=30}
限制:
Map.of()
最多支持 10 个键值对。如果需要更多键值对,可以使用Map.ofEntries()
。
示例 2:使用 Map.ofEntries()
Map<String, Integer> map = Map.ofEntries(
Map.entry("Alice", 25),
Map.entry("Bob", 30),
Map.entry("Charlie", 35)
);
System.out.println(map); // 输出:{Alice=25, Bob=30, Charlie=35}
特点:
- 创建的映射是不可变的,任何修改操作(如
put()
、remove()
)都会抛出UnsupportedOperationException
。 - 键和值都不允许为
null
,否则会抛出NullPointerException
。 - 不允许有重复的键,否则会抛出
IllegalArgumentException
。
4. 不可变集合的优势
- 线程安全:
- 不可变集合在多线程环境中是线程安全的,因为它们的内容无法被修改。
- 性能优化:
- 不可变集合通常比可变集合更高效,因为它们避免了动态扩容和其他同步开销。
- 防止意外修改:
- 不可变集合可以防止代码中意外地修改集合内容,从而提高代码的健壮性。
5. 注意事项
- 不可变性:
- 这些方法创建的集合是不可变的,不能添加、删除或修改元素。
List<String> list = List.of("A", "B");
list.add("C"); // 抛出 UnsupportedOperationException
- 不允许
null
:
List.of()
、Set.of()
和Map.of()
都不允许包含null
元素。
List<String> list = List.of("A", null); // 抛出 NullPointerException
- 小集合适用:
- 这些方法适合创建小型集合。对于大型集合,仍然需要使用传统的构造方法(如
ArrayList
、HashSet
、HashMap
等)。
实际应用场景
以下是一些实际使用场景,展示了这些增强方法的便利性:
场景 1:快速创建常量集合
// 常量列表
List<String> DAYS_OF_WEEK = List.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
// 常量映射
Map<String, String> HTTP_STATUS_CODES = Map.of(
"200", "OK",
"404", "Not Found",
"500", "Internal Server Error"
);
场景 2:测试数据
在单元测试中,可以快速创建测试用的集合:
@Test
void testCollectionOperations() {
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
assertEquals(5, numbers.size());
}
场景 3:配置项
在应用程序中,可以使用不可变集合存储配置信息:
Set<String> ALLOWED_FILE_TYPES = Set.of("txt", "pdf", "docx");
总结
Java 11 的集合增强功能通过引入 List.of()
、Set.of()
和 Map.of()
等静态工厂方法,极大地简化了不可变集合的创建过程。这些方法不仅使代码更加简洁,还提高了集合操作的安全性和性能。