1. Java 9中的不可变集合
在Java 9中,添加了一个十分实用的新特性:不可变集合。这一特性让我们可以方便地创建、操作、共享和使用不可变集合。
2. 初始化不可变集合
不可变集合有很多优点,如线程安全、提高性能等,但是在Java 8及之前的版本中初始化不可变集合需要手动实现,而在Java 9中则非常简单。
2.1 使用of()方法创建不可变集合
Java 9中,提供了一个方便快捷的方法来初始化不可变集合,就是使用of()
方法。这个方法可以接受任何数量的参数,最多为10个。例如:
List<String> immutableList = List.of("java", "9", "immutable");
Set<Integer> immutableSet = Set.of(1, 2, 3);
Map<String, Integer> immutableMap = Map.of("apple", 1, "banana", 2, "orange", 3);
这里我们使用List.of()
,Set.of()
和Map.of()
方法分别创建了不可变列表、不可变集合和不可变映射。在这里,我们可以看到我们可以很容易地创建不可变集合,而无需声明类型等额外操作,非常方便。
2.2 在不可变集合中添加元素
上面的示例只展示了如何初始化不可变集合,但是在实际开发中,很少只用一次性初始化所有元素。我们可能需要在不可变集合中添加或删除元素。Java 9再次提供了另一个方法来实现这个目的。
copyOf(Collection extends E> coll)
方法可以接受任意集合并创建一个不可变集合副本。我们可以使用这个方法来动态地添加或删除元素。例如:
List<String> mutableList = new ArrayList();
mutableList.add("java");
List<String> immutableList = List.copyOf(mutableList);
mutableList.add("9");
System.out.println("immutableList: " + immutableList);
上述代码中,我们首先创建了一个可变列表mutableList
。然后,我们使用List.copyOf()
方法创建了不可变列表的副本immutableList
,并将其添加到不可变列表中。随后,我们向可变列表中添加了元素"9",最后我们输出了不可变列表的值。
输出结果为:immutableList: [java]
可以看到,当我们向可变列表中添加元素时,不可变列表并没有跟随变化,因为我们是创建了不可变列表的副本。
2.3 使用Builder创建不可变集合
Java 9中,还提供了另一种初始化不可变集合的方式,即使用Builder创建。使用Builder创建不可变集合时,我们可以动态添加或删除元素。
以创建不可变列表为例,创建过程如下:
List<String> list = new ArrayList<>();
list.add("java");
list.add("9");
list.add("immutable");
List<String> immutableList = List.<String>builder()
.addAll(list)
.add("in")
.add("java")
.build();
System.out.println("immutableList: " + immutableList);
我们创建了一个可变列表list
,并向其中添加了元素"java"、"9"和"immutable"。然后,我们使用Builder创建了不可变列表immutableList
,并在其中添加了元素"in"和"java"。
输出结果为:immutableList: [java, 9, immutable, in, java]
可以看到,最终的不可变列表包含了所有添加的元素。
3. Java 9中使用不可变集合的注意事项
在使用不可变集合时,需要注意以下几点:
3.1 不可变集合不能被修改
一旦不可变集合被创建,就不能被修改。如果你想向一个已创建的不可变集合添加元素,你需要创建一个新的不可变集合副本。这也是使用copyOf(Collection<sup>? extends E</sup>> coll)
方法的主要原因。
3.2 不可变集合不一定是线程安全的
不可变集合确实更容易被多个线程安全地共享,但是并不能保证不可变集合一定是线程安全的。例如,如果我们使用不可变列表并同时向它添加元素,那么可能会抛出UnsupportedOperationException
异常。
3.3 不可变集合与元素顺序有关
在不可变集合中,元素的顺序是不可改变的。这意味着,当我们传入集合中的元素时,它们的顺序可能会影响最终创建的不可变集合。
4. 总结
Java 9中的不可变集合为我们提供了方便快捷的初始化和操作方式。我们可以通过of()
方法、copyOf()
方法和Builder来创建和操作不可变集合。但是在使用不可变集合时需要注意元素顺序、线程安全和元素不可修改等问题。