美文网首页程序员
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);
    

    最后

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

    希望有帮助

    参考

    相关文章

      网友评论

        本文标题:Java不可变ArrayList

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