Java不可变ArrayList


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

  · JDK

  · Guava

  · Apache Commons Collection4

  JDK

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

  Collections.unmodifiableList(List list)

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

  public staticListunmodifiableList(List list) {

  return (list instanceof RandomAccess ?

  new UnmodifiableRandomAccessList(list) :

  new UnmodifiableList(list));

  }

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

  Guava

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

  ImmutableList.copyOf(list);

  我们看个案例

  public class App {

  public static void main(String[] args) {

  ListgivenList = Arrays.asList(1, 2, 3, 4, 5, 6);

  ListimmutableList = 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) {

  ListgivenList = Arrays.asList(1, 2, 3, 4, 5, 6);

  Listintegers = 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 list)

  //Guava

  ImmutableList.copyOf(list);

  //Commons Collection4

  ListUtils.unmodifiableList(list);

  最后

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

  希望有帮助



转载于:https://juejin.im/post/5ba2096bf265da0abb142de5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值