踩了一个小坑,今天记录下来
先看代码吧
public static void main(String args[]) {
String toRemove = "bb";
String[] s = new String[]{"aa",toRemove,"cc","dd"};
List<String> sList = Arrays.asList(s);
sList.remove(toRemove);
}
会有问题吗?
很遗憾,remove这行会直接抛出异常
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:161) at java.util.AbstractList$Itr.remove(AbstractList.java:374) at java.util.AbstractCollection.remove(AbstractCollection.java:293)
使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,
它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
为什么
看Arrays.java源码
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
没有问题啊, 返回一个ArrayList
仔细看, 此ArrayList非彼ArrayList
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
他是Arrays类里定义的一个内部类
很遗憾 并没有实现集合的修改方法,这里调用remove将直接调用父类AbstractList的remove方法。
public E remove(int index) {
throw new UnsupportedOperationException();
}
Arrays.asList
体现的是适配器模式,只是转换接口,后台的数据仍是数组。
网友评论