美文网首页程序员
Java不可变ArrayList

Java不可变ArrayList

作者: Real_man | 来源:发表于2018-09-18 21:47 被阅读6次

集合类在Java中是引用类型,在操作的时候可能不经意间被程序修改,一些初级开发经常会犯类似的错误。这里我们讨论下如何让ArrayList不可改变。本文将演示以下几种方式:

  • JDK
  • Guava
  • Apache Commons Collection4

JDK

JDK给我们提供了一个很简便的方式从集合中获取一个不可变集合

Collections.unmodifiableList(List<? extends T> list)

我们可以简单的看一下其实现方式:

    public static <T> List<T> unmodifiableList(List<? extends T> list) {
        return (list instanceof RandomAccess ?
                new UnmodifiableRandomAccessList<>(list) :
                new UnmodifiableList<>(list));
    }


image.png

我们可以看到UnmodifiableList内对集合的操作都会抛出异常,所以返回的集合,列表对象是不可变的。

Guava

guava提供了一个创建不可变列表的对象ImmutableList

ImmutableList.copyOf(list);

我们看个案例

public class App {
    public static void main(String[] args) {
        List<Integer> givenList = Arrays.asList(1, 2, 3, 4, 5, 6);
        List<Integer> immutableList = ImmutableList.copyOf(givenList);
        immutableList.add(10);
    }
}
// 会抛出异常
Exception in thread "main" java.lang.UnsupportedOperationException
    at com.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:225)
    at me.aihe.App.main(App.java:19)

Commons Collection

Apache Commons给我们提供了很多工具类,Collection也是其中的一个工具库,也提供了一个简单的API来创建不可变列表。

ListUtils.unmodifiableList(list);

然后演示一个简单的案例,会抛出UnsupportedOperationException。

public class App {
    public static void main(String[] args) {
        List<Integer> givenList = Arrays.asList(1, 2, 3, 4, 5, 6);
        List<Integer> integers = ListUtils.unmodifiableList(givenList);
        integers.add(10);
    }
}
//结果抛出异常
Exception in thread "main" java.lang.UnsupportedOperationException
    at org.apache.commons.collections4.list.UnmodifiableList.add(UnmodifiableList.java:83)
    at me.aihe.App.main(App.java:19)

小结

//JDK
Collections.unmodifiableList(List<? extends T> list)
//Guava
ImmutableList.copyOf(list);
//Commons Collection4
ListUtils.unmodifiableList(list);

最后

主要说了几种创建不可变列表的方法,做了简单的演示,开发中有时会碰到的场景之一。

希望有帮助

参考

相关文章

  • 9 ArrayList集合

    ArrayList是可变长数据集合,对应python list列表,在java.util.ArrayList,是个...

  • 程序与容器

    java有mao,list,数组,hashmap,arraylist scala还有可变容器和不可变容器, red...

  • Java不可变ArrayList

    集合类在Java中是引用类型,在操作的时候可能不经意间被程序修改,一些初级开发经常会犯类似的错误。这里我们讨论下如...

  • 集合和并发包一览

    Java 集合 Collection List ArrayList 实现原理:基于可变数组实现,默认容量10,最大...

  • ArrayList源码分析-基于JDK1.8

    ArrayList基本介绍 ArrayList是一个可变的数组,相当于动态数组。与Java中的数组相比,它提供了动...

  • ArrayList使用与分析

    简介 java.util.ArrayList是Java集合框架中list接口的可变数组的实现,对list接口的全部...

  • ArrayList实现原理

    ArrayList源码分析 1、ArrayList概述 ​ ArrayList 是List 接口的可变...

  • Android 知识梳理目录 - To do

    一、Java 基础知识 String 为什么设计为不可变的 ArrayList和数组的转换 HashMap死循环 ...

  • ArrayList集合

    集合概述 集合,长度可变的容器 1 ArrayList集合可变长度原理: ArrayList集合:底层原理也是,数...

  • Kotlin之“ArrayList”

    简介 ArrayList 可以理解为是一个长度可变的集合,在日常开发中使用也比较频繁,这里不写与java中的Arr...

网友评论

    本文标题:Java不可变ArrayList

    本文链接:https://www.haomeiwen.com/subject/ucevnftx.html