ArrayList中的 subList 强转 ArrayList 导致异常
ArrayList的sublist结果不可強转成ArrayList,否则会抛出ClassCastException
异常,即java.util.RandomAccesSubList cannot be cast to java. util.ArrayList.
说明: subList 返回的是ArrayList 的内部类SubList, 并不是ArrayList ,而是
ArrayList的一个视图,対于SubList子列表的所有操作最终会反映到原列表上。
ArrayList中的subList切片造成OOM
在业务开发中的时候,他们经常通过subList来获取所需要的那部分数据
在上面的例子中,我们知道了subList所产生的List,其实是对原来List对象的引用
这个产生的List只是原来List对象的视图,也就是说虽然值切片获取了一小段数据,但是原来的List对象却得不到回收,这个原来的List对象可能是一个很大的对象
解决方式:
(1)在subList方法返回SubList,重新使用new ArrayList,来构建一个独立的ArrayList
List list = new ArrayList<>(collect.subList(0, 1));
(2)利用Java8的Stream中的skip和limit来达到切片的目的
List list = collect.stream().skip(0).limit(1).collect(Collectors.toList());
在这里我们可以看到,只要用一个新的容器来装结果,就可以切断与原始List的关系