将一个Array的对象转化为List。常常使用Arrays.asList()这个方法,如下单元测试案例:
@Test
public void testArraysAsList() {
List<Integer> list = Arrays.asList(1,2,3,4,5);
// list.add(8);
assertThat(list, hasItems(1, 2, 3, 4, 5));
logger.info(FastJsonUtil.toJSONString(list, true));
List<Integer> list2 = new ArrayList<>(Arrays.asList(1,2,3,4,5));
list2.add(8);
assertThat(list2, hasItems(1, 2, 3, 4, 5, 8));
logger.info(FastJsonUtil.toJSONString(list2, true));
}
终其原因是Arrays.asList方法返回的ArrayList是继承自AbstractList同时实现了RandomAccess和Serializable接口,定义如下:
private static class ArrayList extends AbstractList implements RandomAccess, java.io.Serializable
再来看看AbstractList这个类的定义:
public abstract class AbstractList<e> extends AbstractCollection<e> implements List<e> </e></e></e>
发现AbstractList这个类的set add remove方法定义如下:
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E set(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}
现在知道了它throw UnsupportedOperationException异常的原因了。
通过上面的分析,我们知道,其实通过asList方法得到的List是只读的,那么平时我们怎样避免这样的错误发生?我们可以采用如下方法:List<Integer> list2 = new ArrayList<>(Arrays.asList(1,2,3,4,5));