大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说Java不可变ArrayList[通俗易懂],希望您对编程的造诣更进一步.
集合类在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));
}
我们可以看到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://daima100.com/13428.html