240. Java 集合 - 使用集合工厂方法创建和处理数据
文章目录
- 240. Java 集合 - 使用集合工厂方法创建和处理数据
- 🛠 创建不可变集合
- 示例:使用工厂方法创建不可变集合
- 📄 获取集合的不可变副本
- 示例:创建不可变副本
- 🔄 将数组包装为 List
- 示例:使用 `Arrays.asList()` 包装数组
- 🎯 小结
240. Java 集合 - 使用集合工厂方法创建和处理数据
🛠 创建不可变集合
Java SE 9 引入了一组工厂方法,用于创建不可变的 List 和 Set 集合。通过调用 List.of() 或 Set.of() 静态方法,你可以轻松创建不可变的集合。
示例:使用工厂方法创建不可变集合
List<String> stringList = List.of("one", "two", "three");
Set<String> stringSet = Set.of("one", "two", "three");
这两个方法都非常简洁,但有一些重要事项需要注意:
- 返回的实现可能不同:返回的集合实现可能并非你熟悉的
ArrayList或HashSet,因此你的代码不应依赖于其具体实现。 - 不可变结构:返回的集合是不可变的,你无法向集合中添加或修改元素。如果集合中的元素是可变对象,你仍然可以修改这些对象本身。
- 不允许
null元素:你不能将null元素添加到这些集合中,否则会抛出NullPointerException异常。 - 集合不允许重复元素:
Set不允许重复元素,因此如果你尝试向Set中添加重复元素,将会抛出异常。 - 实现是可序列化的:返回的集合是
Serializable的,可以进行序列化操作。
这些 of() 方法通常被称为集合的便捷工厂方法,用于快速创建不可变集合。
📄 获取集合的不可变副本
在 Java SE 10 中,Java 引入了新的便捷方法来创建现有集合的不可变副本。你可以使用 List.copyOf() 和 Set.copyOf() 方法,它们遵循相同的模式。
示例:创建不可变副本
Collection<String> strings = Arrays.asList("one", "two", "three");List<String> list = List.copyOf(strings);
Set<String> set = Set.copyOf(strings);
注意事项:
- 传入的集合不能为
null,且不能包含null元素。如果集合包含重复元素,Set.copyOf()会去除重复元素,仅保留一个。 - 返回的集合是不可变的,对副本的任何修改不会影响原集合。
- 如果传入的集合包含
null元素,会抛出NullPointerException异常。
这些方法提供了一种创建集合副本的简便方式,并确保副本是不可变的。
🔄 将数组包装为 List
Collections 框架中有一个名为 Arrays 的类,提供了大约 200 个方法来处理数组,这些方法主要用于排序、合并、查找等操作。但其中一个方法 Arrays.asList() 非常有用,它可以将一个数组包装成一个 List。
示例:使用 Arrays.asList() 包装数组
String[] arr = {"one", "two", "three"};
List<String> list = Arrays.asList(arr);
System.out.println(list);
Arrays.asList() 方法将数组转换为一个 List,并保留数组的顺序。
注意:
- 返回的
List实际上是数组的一个视图,它与原始数组共享数据结构。 - 这种
List的大小是固定的,不能添加或删除元素。如果你尝试执行这些操作,会抛出UnsupportedOperationException异常。 - 你可以替换现有的元素,但不能添加或删除元素。例如:
list.set(0, "newOne"); // 这会成功
list.add("four"); // 会抛出 UnsupportedOperationException 异常
因此,虽然通过 Arrays.asList() 返回的 List 并不是完全不可变的,但它在大小上是受限的,且只能通过替换元素来修改内容。
🎯 小结
List.of()和Set.of():这些方法用于创建不可变的集合,集合不允许包含null元素,并且不支持修改。List.copyOf()和Set.copyOf():这些方法用于创建现有集合的不可变副本,副本是独立的,不会影响原集合。Arrays.asList():将数组包装为一个List,它是数组的视图,大小固定,只能替换元素,不能进行增删操作。
