以 Iterator.remove()为例子
直接看代码
public static void main(String[] args) {
List<String> alist = Arrays.asList(new String());
Iterator<String> iterator = alist.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
//过滤list元素逻辑
if (true) {
iterator.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)
改为正确方式
public static void main(String[] args) {
List<String> alist = new ArrayList<>();
alist.add("test");
Iterator<String> iterator = alist.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
//过滤list元素逻辑
if (true) {
iterator.remove();
}
}
}
两种方式区别
List<String> alist = Arrays.asList(new String());
List<String> alist = new ArrayList<>();
alist.add("test");
导致报错原因:
首先分析两者之间获取的 Iterator 接口实例是否相同。(Iterator 本身是接口 默认remove方法为default void remove() { throw new UnsupportedOperationException("remove");} 如果抛异常也是实例覆盖remove方法抛出异常)
Iterator<String> iterator = alist.iterator();
很显然不同,一个是ArrayList 一个是 AbstractList
Arrays.asList();方式
可以看到Arrays 使用自己内部 静态 ArrayList 并不是 java.util.ArrayList