您的位置:首页 > 其它

Arrays.asList(T... a)分析

2015-09-10 00:37 246 查看
昨天做OJ时,一个把数组转化为List时,运用remove方法删除一个元素一直报Exception in thread "main" java.lang.UnsupportedOperationException错误,这让我郁闷了好久,可能这种心态不是程序员应该有的,程序员都是看到问题应该高兴才对,哈哈!

所以晚上想想这是为什么,为什么还是菜鸟程序员,为什么不进一步分析,打开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);
}
}


今天到这里了,希望以后面对问题要以合格程序员的心态来面对!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: