Arrays.asList()返回的List不能add和remove

来源:互联网 发布:python 定义类 编辑:程序博客网 时间:2024/06/05 09:56
今天在阅读java编程思想P220的时候看到一句话

“如果你试图用add()或delete()方法在这种列表中添加或删除元素就有可能会引发去改变数组尺寸的尝试,因此你将在运行时获得"Unsupported Operation"错误”

我查了查文档,Arrays.asList()方法描述如下:
返回值:List<T>
描述:Returns a fixed-size list backed by the specified array. 
中文意思是:通过特定的数组返回一个固定长度的list


脑子里第一个想法是:List不是应该自动扩容吗,为什么数组长度会固定了?我不信,我得试一下。

import java.util.Arrays;import java.util.List;public class TestasList {public static void main(String[] args) {List list = Arrays.asList(1,2,3);list.add(4);}}

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractList.add(Unknown Source)
at com.cqw.collections.TestasList.main(TestasList.java:10)

果不其然抛出了unsupportedOperation异常,百思不得其解,只能看源码了,于是对准asList方法一个Ctrl+鼠标左击,就进入到Arrays.asList()

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

内心:
???
ArrayList还有这种操作?连add都不给我用了?


仔细往下看:

private static class ArrayList<E> extends AbstractList<E>{...}

原来此ArrayList非彼ArrayList,是Arrays自己定义的内部类。


于是乎我就开始在这个“假”ArrayList里面找add和remove方法
找了半天,没找到
???
难道在父类AbstractList里面?而这个假ArrayList并没有重写??
于是乎就点进了

它的父类AbstractList,偷窥它的源码,刚点开鼠标滑了一下就看到了这狗贼的add方法
 public boolean add(E e) {        add(size(), e);        return true;    }
再跟踪里面重载的add方法
public void add(int index, E element) {        throw new UnsupportedOperationException();    }

终于找到罪魁祸首了。


总结原因就是Arrays的内部类ArrayList并没有重写它的父类AbstractList的add(E e)方法,所以在我开头的代码调用List.add(4)时,实际是调用了AbstractList的add方法,于是就抛异常。

阅读全文
0 0
原创粉丝点击