Arrays.asList 为何不能添加删除元素的研究

Arrays.asList() --研究

最常见的未获支持的操作,都来源于背后固定大小的数据结构支持的容器。当我们使用Arrays.asList()时,就会得到这样的容器。当然你还可以使用Collections类中不可修改的方法。

代码示例:

public class UnSupported {
    static void test(String msg, List<String> list) {
        System.out.println("---" + msg + "---");
        Collection<String> collection = list;
        Collection<String> subList = list.subList(1, 8);
        Collection<String> c2 = new ArrayList<>(subList);
        try {
            collection.retainAll(c2);
            System.out.println("正常运行collection.retainAll(c2)");
        } catch (Exception e) {
            System.out.println("retainAll():" + e);
        }

        try {
            collection.removeAll(c2);
            System.out.println("正常运行collection.removeAll(c2)");
        } catch (Exception e) {
            System.out.println("retainAll():" + e);
        }
    }

    public static void main(String[] args) {
        // Arrays.asList 生成的是一个固定的数组 不支持修改数组大小的操作
        List<String> list = Arrays.asList("1 2 3 4 5 6 7 8 9 10 11".split(" "));
        test("Arrays.asList()", list);
        test("Modifiable copy", new ArrayList<>(list));
    }
}

运行结果:

---Arrays.asList()---
retainAll():java.lang.UnsupportedOperationException
retainAll():java.lang.UnsupportedOperationException
---Modifiable copy---
正常运行collection.retainAll(c2)
正常运行collection.removeAll(c2)

分析 我们断点调试
Arrays.asList 为何不能添加删除元素的研究_第1张图片
这里我们可以看到list的类型是为Arrays下的ArrayList,这到底是什么呢,我们不妨点开源代码看一下。

这是Arrays.asList()方法,我们继续点进去


  public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

这是Arrays 下的ArrayList类的代码片段

    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);
        }

很明显的我们可以看到它的构造 ArrayList(E[] array) {} 这里传递的就是一个固定大小的数组,其类也没有重写相关的add方法。那么我们点进它的父类看一下(AbstractList

这是0AbstractList下的add方法。我们继续点进去

//这是AbstractList下的add方法。我们继续点进去
public boolean add(E e) {
        add(size(), e);
        return true;
    }

看 答案是不是出来了呢,直接抛出UnsupportedOperationException这个异常

  public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

提问采坑题:

 int num[] = {1,2,3};
 List<int[]> list_int = Arrays.asList(num);
 System.out.println(list_int.size());

想必很多人的答案都是3吧,答案其实是1。 因为int是基本类型,而泛型不接受基本类型。不知道的可以自己看看书。不多做解释了。
int 类型改为Integer 答案便是3了。

你可能感兴趣的:(java,容器)