原创

迭代器模式删除元素

在开发的时候,有时候会遇到在遍历数组元素的时候,要对元素进行删除,如果直接在for循环的时候删除会出现一些异常

这个时候迭代器(Iterator)就显得很重要了

Iterator提供了3种方法:
hasNext() : 如果还有下一个元素,则返回true
next() : 返回下一个元素回来
remove() : 移除当前元素

正确代码:
List list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
Iterator iterator = list.iterator();
while (iterator.hasNext()){
String name = iterator.next();
if (name.equals("a")) {
iterator.remove();
}
}

代码风格类似这个样子的

但是今天我却遇到了另一个问题

代码如下:
List list = Arrays.asList("a","b","c");
Iterator iterator = list.iterator();
while (iterator.hasNext()){
String name = iterator.next();
if (name.equals("a")) {
iterator.remove();
}
}

可以看到,这两个代码几乎差不多,但是下面的这个代码却在运行的时候抛出了Exception in thread "main" java.lang.UnsupportedOperationException
这个异常,一开始我以为是我的迭代器模式写法有问题,然后问了几个同事说是不是JDK8有更新了迭代器的写法
同事也看不出来哪里有问题,然后就上网问度娘,找了好久才找到原因
问题出在Arrays 这个工具类上面
Arrays.asList 返回的是自己内部的ArrayList
而new ArrayList()返回的是java.util.ArrayList
虽然这两个ArrayList都是继承AbstractList,但是在Arrays.asList里面并没有重写AbstractList抽象类种的remove、add等方法,而是直接抛出UnsupportedOperationException

正文到此结束