Arrays.asList()需要注意的点

 

千万不要这样使用Arrays.asList !

测试的几种情况及原因:

public static void main(String[] args) {

//第一种基本类型数组 int[] arr = {1,2,3,4}; List list = Arrays.asList(arr); System.out.println(list.size()); //1 // 由于Arrays.ArrayList参数为可变长泛型,而基本类型是无法泛型化的, // 所以它把int[] arr数组当成了一个泛型对象,所以集合中最终只有一个元素arr。 for (int i=0;i<list.size();i++){ System.out.println(i+list.get(i).toString()); }//0[I@1134affc

//第二种字符串数组修改 String[] strArr = {"sha","diao","nv","hai"}; List list2 = Arrays.asList(strArr); strArr[1]="cha"; list2.set(2, "nan"); System.out.println(strArr[1].hashCode()); //98460 System.out.println(list2.get(1).hashCode());//98460 // 由于asList产生的集合元素是直接引用作为参数的数组, // 所以当外部数组或集合改变时,数组和集合会同步变化,这在平时我们编码时可能产生莫名的问题。 System.out.println(Arrays.toString(strArr));//[sha, cha, nan, hai] System.out.println(list2.toString());//[sha, cha, nan, hai]

//第三种list增加、删除操作 String[] strArr1 = {"sha","diao","nv","hai"}; List list1 = Arrays.asList(strArr1); //返回的是Arrays的内部类Arraylist,并不是java.util报里面的, // 这个Arraylist实现了AbstractList但是并没有重载add和remove方法 //AbstractList像一个适配器是直接抛异常的 list1.add("zi"); //UnsupportedOperationException异常 list1.remove("sha"); list1.remove("diao"); System.out.println(list1.toString()); }
Arrays.asList()源码:
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }




    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }
...}