Arrays.asList、ArrayList.subList使用规范
1、使用Arrays.asList的注意事项
使用Arrays.asList()把数组转换为集合时,不能使用其修改集合相关的方法,如add/remove/clear等,均会抛出UnsupportedOperationException异常。
因为asList返回的对象不是我们常用的java.util包下的ArrayList,而是Arrays的内部类,虽然它们都继承自AbstractList,但是后者并没有实现其中跟修改集合相关的方法。Arrays.asList()体现的是适配器模式,只是转换接口,后台的数据仍是数组。
当数组的某个元素被修改时,list中的值也会随之改变。
总而言之Arrays.asList方法一般用在一些简单的场合使用,比如快速声明一个集合,判断某个值是否在允许的范围内等,而不应该用于创建后还需修改的情景。
2、使用ArrayList的subList的注意事项
- 修改原集合元素的值,会影响子集合
- 修改原集合的结构,会引起ConcurrentModificationException异常
- 修改子集合元素的值,会影响原集合
- 修改子集合的结构,会影响原集合
subList()结果不可以强制转成ArrayList,否则会抛出ClassCastException异常。因为subList返回的SubList是ArrayList的内部类,并不是ArrayList而是ArrayList的一个视图(在SubList的构造函数中并没有创建一个新的ArrayList),对SubList子列表的所有操作最终会反映到原列表上。
在subList场景中,高度注意对父集合元素的增加或删除,均会导致子列表的遍历、增加、删除产生ConcurrentModificationException异常(异常并不是在添加或删除元素时发生的,而是在子集合操作时发生的)