Arrays 转 list 5 大坑

发布时间 2023-06-28 17:32:38作者: 小三的小四
1.如果是基本类型,他代表是一个对象,所以size是1  改正:改成包装类:Integer
public
static void main(String[] args) { int[] a={1,2,3}; List ints = Arrays.asList(a); System.out.println(ints.size()); // 1 ints.forEach(x-> System.out.println(x));// [I@68f7aae2 }

 

2.如果修改了数组的值,遍历list的时候,值也会改变,地址引用
public
static void main(String[] args) { Integer[] a={1,2,3}; List ints = Arrays.asList(a); a[0]=10; ints.forEach(x-> System.out.println(x));// 10,2,3 }

 

3.asList的数组无法进行,添加删除操作,只能查看,因为他自身是一内部类,里卖没有重写add方法,所以执行的是父类的AbstractList的add方法
而父类的add方法就是直接报错
public static void main(String[] args) {
        Integer[] a={1,2,3};
        List ints = Arrays.asList(a);
        ints.add(4);// java.lang.UnsupportedOperationException
}

 

4.对于subList得到的数组无法强制转换成ArrayList,SubList是ArrayList的一个内部类 Sublist只是一个ArrayList的一个视图,所以转换失败
但是用List是可以正常转换的
public
static void main(String[] args) { Integer[] a={1,2,3}; List ints = Arrays.asList(a); ArrayList list = (ArrayList)ints.subList(0, 1);
     // List list = ints.subList(0, 1);正常 同时如果修改ints数组的值,sublist的数组也会改变,因为也只是地址引用关系
        list.forEach(x-> System.out.println(x));// java.lang.ClassCastException: java.util.RandomAccessSubList cannot be cast to java.util.ArrayList
}

 

5 对于上面问题,sublist可能会造成OOM

因为sublist截取之后,原数组无法被回收,会一直在内存中

解决:用new ArrrayList来接收返回的sublist数组