Java基础学习总结(129)——Arrays.asList得到的List进行add和remove等操作出现异常解析

将一个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));

猜你喜欢

转载自blog.csdn.net/u012562943/article/details/81252125