240. Java 集合 - 使用集合工厂方法创建和处理数据

47 阅读3分钟

240. Java 集合 - 使用集合工厂方法创建和处理数据

🛠 创建不可变集合

Java SE 9 引入了一组工厂方法,用于创建不可变的 ListSet 集合。通过调用 List.of()Set.of() 静态方法,你可以轻松创建不可变的集合。

示例:使用工厂方法创建不可变集合
List<String> stringList = List.of("one", "two", "three");
Set<String> stringSet = Set.of("one", "two", "three");

这两个方法都非常简洁,但有一些重要事项需要注意:

  1. 返回的实现可能不同:返回的集合实现可能并非你熟悉的 ArrayListHashSet,因此你的代码不应依赖于其具体实现。
  2. 不可变结构:返回的集合是不可变的,你无法向集合中添加或修改元素。如果集合中的元素是可变对象,你仍然可以修改这些对象本身。
  3. 不允许 null 元素:你不能将 null 元素添加到这些集合中,否则会抛出 NullPointerException 异常。
  4. 集合不允许重复元素Set 不允许重复元素,因此如果你尝试向 Set 中添加重复元素,将会抛出异常。
  5. 实现是可序列化的:返回的集合是 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 并不是完全不可变的,但它在大小上是受限的,且只能通过替换元素来修改内容。


🎯 小结

  1. List.of()Set.of():这些方法用于创建不可变的集合,集合不允许包含 null 元素,并且不支持修改。
  2. List.copyOf()Set.copyOf():这些方法用于创建现有集合的不可变副本,副本是独立的,不会影响原集合。
  3. Arrays.asList():将数组包装为一个 List,它是数组的视图,大小固定,只能替换元素,不能进行增删操作。