您现在的位置是:首页 > 文章详情

Java不可变ArrayList

日期:2018-09-17点击:469

集合类在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)); } 
img_4d675c1940f45d3bd1f52f799a59686f.png
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); 

最后

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

希望有帮助

参考

原文链接:https://yq.aliyun.com/articles/666908
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章