Arrays.asList(T... a)分析
2015-09-10 00:37
295 查看
昨天做OJ时,一个把数组转化为List时,运用remove方法删除一个元素一直报Exception in thread "main" java.lang.UnsupportedOperationException错误,这让我郁闷了好久,可能这种心态不是程序员应该有的,程序员都是看到问题应该高兴才对,哈哈!
所以晚上想想这是为什么,为什么还是菜鸟程序员,为什么不进一步分析,打开Arrays.asList(T... a)中源码(jdk1.7),原来如此:
看到了吗?此方法new出来一个新的ArrayList,此ArrayList继承了AbstracList类,并且实现了get,set和contains方法,看看内部类的实现:
到此为什么remove和add方法会报错呢,请看看AbstracList的内部实现:
现在终于明白为什么会报错了吧!哈哈,但是怎样才能让它可以add和remove呢?以List的实现类ArrayList的构造方法就可以实现,下面的例子:
今天到这里了,希望以后面对问题要以合格程序员的心态来面对!
所以晚上想想这是为什么,为什么还是菜鸟程序员,为什么不进一步分析,打开Arrays.asList(T... a)中源码(jdk1.7),原来如此:
<pre name="code" class="java">public static <T> List<T> asList(T... a) { return new ArrayList<T>(a); }
看到了吗?此方法new出来一个新的ArrayList,此ArrayList继承了AbstracList类,并且实现了get,set和contains方法,看看内部类的实现:
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) { if (array == null) throw new NullPointerException(); a = array; } public int size() { return a.length; } public Object[] toArray() { return a.clone(); } public <T> T[] toArray(T[] a) { int size = size(); if (a.length < size) return Arrays.copyOf(this.a, size, (Class<? extends T[]>) a .getClass()); System.arraycopy(this.a, 0, a, 0, size); if (a.length > size) a[size] = null; return a; } public E get(int index) { return a[index]; } public E set(int index, E element) { E oldValue = a[index]; a[index] = element; return oldValue; } public int indexOf(Object o) { if (o == null) { for (int i = 0; i < a.length; i++) if (a[i] == null) return i; } else { for (int i = 0; i < a.length; i++) if (o.equals(a[i])) return i; } return -1; } public boolean contains(Object o) { return indexOf(o) != -1; } }
到此为什么remove和add方法会报错呢,请看看AbstracList的内部实现:
<span style="white-space:pre"> </span>public E set(int index, E element) { throw new UnsupportedOperationException(); } public void add(int index, E element) { throw new UnsupportedOperationException(); } public E remove(int index) { throw new UnsupportedOperationException(); }
现在终于明白为什么会报错了吧!哈哈,但是怎样才能让它可以add和remove呢?以List的实现类ArrayList的构造方法就可以实现,下面的例子:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class TestList { public static void main(String[] args) { String s = "12 67 98 2 7"; String[] strs = s.split(" "); List<String> list = Arrays.asList(strs); list.set(1, "as"); //list.add("ee"); 报错 List<String> list1 = new ArrayList<String>(list); System.out.println(list1.add("111")); System.out.println(list1); } }
今天到这里了,希望以后面对问题要以合格程序员的心态来面对!
相关文章推荐
- Quick-Cocos2d-x初学者游戏教程(四) --------------- 开发初探(添加背景,标题,动作,按钮)
- 1、shader简介、渲染管线
- Axure学习笔记
- C++ <getline及atoi>
- Uva-10410 Tree Reconstruction
- MFC +ACCESS + SOCKET
- Vmware虚拟机进入BIOS方法
- 设计模式学习笔记二十二:对象的轮回 - 通用对象池的实现
- 吓尿了,mac下bash出了问题
- AngularJs SPA Template
- libevent使用点滴(2)bufferevent_pair_new的事件时并不能使其循环
- 配置Java开发环境
- 静态页面布局
- 数据结构中树的表示方法
- 【CCF】有趣的数
- C++/MFC如何启动另一个应用程序并获取其进程 ID
- 视频测试的Dataset
- XHTML表格
- 何为动态绑定(转)
- Leetcode Perfect Squares