Arrays.asList的几个坑

56 阅读1分钟

Arrays.asList的几个坑

case1:
    public static void main(String[] args) {  
        int[] array = {123};  
        List list = Arrays.asList(array);  
        System.out.println(list.size());  
    }
    // 输出:1
    public static <T> List<T> asList(T... a) {  
        return new ArrayList<>(a);  
    }
    

case2:
    public static void main(String[] args) {  
        String[] array = {"1""2""3"};  
        List list = Arrays.asList(array);  
        list.add("5");  
        System.out.println(list.size());  
    }
    // 
    Exception in thread "main" java.lang.UnsupportedOperationException  
     at java.util.AbstractList.add(AbstractList.java:148)  
     at java.util.AbstractList.add(AbstractList.java:108)  
     at object.ArrayAsListTest.main(ArrayAsListTest.java:11)
    
Arrays.asList 返回的 List 并不是我们期望的 java.util.ArrayList,而是 Arrays 的内部类 ArrayList。内部类的ArrayList没有实现add方法,而是父类的add方法的实现,是会抛出异常的呢。


case3:
    public static void main(String[] args) {  
        String[] arr = {"1""2""3"};  
        List list = Arrays.asList(arr);  
        arr[1] = "4";  
        System.out.println("原始数组"+Arrays.toString(arr));  
        System.out.println("list数组" + list);  
    }
    //
    原始数组[143]  
    list数组[143]
从运行结果可以看到,原数组改变,Arrays.asList转化来的list也跟着改变啦,大家使用的时候要注意一下哦,可以用new ArrayList(Arrays.asList(arr))包一下的。


case4:
    public static void main(String[] args) {  
        List<String> list = new ArrayList<String>(1);  
        list.add("公众号");  
        String[] array21 = (String[])list.toArray();//类型转换异常  
    }
    //
因为返回的是Object类型,Object类型数组强转String数组,会发生ClassCastException。解决方案是,使用toArray()重载方法toArray(T[] a)