集合的增删
平时经常会有一些对集合的增删场景,尤其是在循环内进行删除,下面我们看下这几种场景。
普通for循环
首先,使用 普通for循环可以对集合进行增删,但增删后由于普通for循环时是通过下标索引访问,因此有可能遇到某些数据读不到的问题。进行完全遍历时,由于集合长度已发生变化,会抛出IndexOutOfBoundsException下标越界异常。
看一个例子。
for (int i = 0; i <6 ; i++) {
System.out.println("读取"+list.get(i));
if (3 == i) {
list.remove(i);
}
}
上述代码输出了
读取0
读取1
读取2
读取3
读取5
Exception in thread "Thread-1" java.lang.IndexOutOfBoundsException: Index: 5, Size: 5
读取了3之后直接跳到5,没有读取4,因为删除掉[3]之后,原本在[4]位置的4下标变为[3],但循环已经跳过,所以漏了一个。此处可以通过手动控制在删除后i-1可以避免。但最后的下标越界异常是无法避免的,因此不要在for循环内进行超过1个的集合增删操作。
增强for循环
在《阿里巴巴JAVA开发规范》中有这样一段话
【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator
方式,如果并发操作,需要对 Iterator 对象加锁。
写代码尝试了一下,在foreach中进行任意的增删操作,均会抛出ConcurrentModificationException异常。我们写一段代码。
for (int j: list) {
System.out.println("读取"+j