您的位置:首页 > 其它

Arrays.asList使用

2016-09-13 16:59 281 查看
Arrays是java.util提供的一个操作数组的工具类,里面有很多使用的方法,我们来看一个比较常用的asList(),

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


测试代码:

public static void main(String[] args) {
List<String> arraylist=new ArrayList<String>();
arraylist=Arrays.asList("1","2");
for(String s : arraylist){
System.out.println(s);
}

}


输出结果:

**1

2**

这个方法使用起来简化了许多操作,使用也比较方便,但是随之也带来了一些问题。如下

public static void main(String[] args) {
List<String> arraylist=new ArrayList<String>();
arraylist=Arrays.asList("1","2");
arraylist.add("3");//向arraylist增加数据
for(String s : arraylist){
System.out.println(s);
}

}


输出结果:

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at com.test.ThinkInJava.listImpl.TestList.main(TestList.java:14)


竟然抛出了一个异常,看编写的代码感觉没有问题,但是为什么一个简单的add()操作会抛出一个“不支持操作”的异常呢,下面我们来看一下源码。一谈究竟



此时的arraylist还是List的实现类,AbstractList的子类,断点继续向下走。



此时arraylist已经边成了Arrays的一个内部类,AbstractList的子类,并且返回的只是定长的String数组,无法改变长度。

下面是AbstractList抽象类定义的add方法,并没有做具体实现只是抛出了一个异常,

public boolean add(E e) {
add(size(), e);
return true;
}

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


总结:由于Arrays的内部累ArrayList并没有重写父类AbstractList的add方法,所以调用的是父类AbstractList的add方法,AbstractList并没有对add方法做重写,

romove方法跟add方法一样,都是没有重写父类的方法,

可以通过new ArrayList(arraylist),转换为ArrayList操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: