Java不可变ArrayList

379 阅读1分钟


  集合类在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);

  最后

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

  希望有帮助