你知道Java中有不可变ArrayList吗?

1.概述

本快速教程将展示如何使用核心JDK 创建一个ArrayList不可变,使用Guava,最后使用Apache Commons Collections 4。

2.使用JDK

首先,JDK提供了一种从现有集合中获取不可修改集合的好方法:

Collections.unmodifiableList(list);

此时新集合不再可修改:

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

3.使用Guava

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

ImmutableList.copyOf(list);

同样 - 结果列表不应该是可修改的:

@Test(expected = UnsupportedOperationException.class)
public void givenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable() {
    List<String> list = new ArrayList<String>(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<String>(Arrays.asList("one", "two", "three"));
    ImmutableList<Object> unmodifiableList = ImmutableList.builder().addAll(list).build();
    unmodifiableList.add("four");
}

4.使用Apache Collections Commons

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

ListUtils.unmodifiableList(list);

同样,修改结果列表应该导致UnsupportedOperationException:

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

5.结论

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

微信关注:Java知己, 每天更新Java知识哦,期待你的到来!

image

猜你喜欢

转载自blog.csdn.net/feilang00/article/details/86502172
今日推荐