Java中的不可改变的ArrayList

评论 0 浏览 0 2013-12-24

1.概述

这个快速教程将展示如何用核心JDK、Guava和最后用Apache Commons Collections 4 使ArrayList不可变

这篇文章是the “Java –Back to Basic”系列的一部分这里是Baeldung。

进一步的阅读。

将一个Java流收集到一个不可变的集合中去

不动产的介绍

Java –从列表中获取随机项目/元素

2.使用JDK

首先,JDK提供了一个很好的方法,可以从现有的集合中得到一个不可修改的集合。

Collections.unmodifiableList(list);

这时,新的集合不应该再被修改了。

@Test(expected = UnsupportedOperationException.class)
public void givenUsingTheJdk_whenUnmodifiableListIsCreated_thenNotModifiable() {
    List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    List<String> unmodifiableList = Collections.unmodifiableList(list);
    unmodifiableList.add("four");
}

2.1.使用Java 9

从Java 9开始,我们可以使用List<E>.of(E…elements)静态工厂方法来创建一个不可变的列表。

@Test(expected = UnsupportedOperationException.class)
public final void givenUsingTheJava9_whenUnmodifiableListIsCreated_thenNotModifiable() {
    final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    final List<String> unmodifiableList = List.of(list.toArray(new String[]{}));
    unmodifiableList.add("four");
}

请注意,我们必须将现有的list转换成数组。这是因为List.of(元素)接受可变参数。

3.使用 Guava

Guava提供了类似的功能来创建它自己的ImmutableList版本。

ImmutableList.copyOf(list);

同样地 – 所产生的列表不应该是可修改的。

@Test(expected = UnsupportedOperationException.class)
public void givenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable() {
    List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    List<String> unmodifiableList = ImmutableList.copyOf(list);
    unmodifiableList.add("four");
}

请注意,这个操作实际上将创建一个原始列表的副本,而不仅仅是一个视图。

Guava还提供了一个构建器 – 这将会返回强类型的ImmutableList,而不是简单的List

@Test(expected = UnsupportedOperationException.class)
public void givenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable() {
    List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    ImmutableList<String> unmodifiableList = ImmutableList.<String>builder().addAll(list).build();
    unmodifiableList.add("four");
}

4.使用Apache Collections Commons

最后,Commons Collection还提供了一个API,用于创建一个不可修改的列表。

ListUtils.unmodifiableList(list);

再说一遍,修改所产生的列表应该导致不支持操作的异常

@Test(expected = UnsupportedOperationException.class)
public void givenUsingCommonsCollections_whenUnmodifiableListIsCreated_thenNotModifiable() {
    List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    List<String> unmodifiableList = ListUtils.unmodifiableList(list);
    unmodifiableList.add("four");
}

5.总结

本教程说明了如何使用核心JDK、Google Guava或Apache Commons Collections轻松从现有的ArrayList中创建一个不可修改的List。

所有这些例子和代码片段的实现可以在Github上找到--这是一个基于Maven的项目,所以应该很容易导入和运行,就像现在一样。

最后更新2023-11-11
0 个评论
标签