java arraylist遍历删除_ArrayList和CopyOnWriteArrayList的遍历与删除

ArrayList的遍历方法与删除中的异常情况分析

package com.test;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

/**

* @author yuhao

**/

public class Test {

private static List list = new ArrayList<>(10);

static {

for (int i = 0; i < 10; i++) {

list.add(i);

}

}

public static void main(String[] args) {

//遍历

traverse();

//删除元素

remove();

}

private static void traverse() {

//遍历的4种方式

System.out.println("遍历开始");

for (int i = 0; i < list.size(); i++) {

System.out.print(list.get(i));

}

System.out.println();

Iterator iterator = list.iterator();

while (iterator.hasNext()) {

System.out.print(iterator.next());

}

System.out.println();

list.forEach(System.out::print);

System.out.println();

for (Integer ls : list) {

System.out.print(ls);

}

System.out.println();

System.out.println("遍历结束");

}

/**

* ArrayList的迭代器使用的是其内部类Itr完成的

* java.util.ConcurrentModificationException 分析

*/

private static void remove() {

System.out.println("删除开始");

//集合增删

//结果正常:[0, 1, 3, 4, 5, 6, 7, 8, 9]

//remove1();

//结果正常:[0, 1, 3, 4, 5, 6, 7, 8, 9]

//remove2();

//异常

//remove3();

//异常

//remove4();

//异常

//remove5();

//推荐使用这种方法删除

list.removeIf(Test::ok);

System.out.println(list);

System.out.println("删除结束");

}

/**

* modCount和expectedModCount的目的就是保证只有迭代期间只有一个迭代器对集合进行迭代

* 而此处就是因为由多个迭代器一起执行造成的异常

*/

private static void remove5() {

List list3 = new ArrayList<>(list);

Iterator iterator1 = list3.iterator();

Iterator iterator2 = list3.iterator();

while (iterator1.hasNext()) {

Integer next = iterator1.next();

Integer next1 = iterator2.next();

if (ok(next)) {

iterator1.remove();

}

}

System.out.println(list3);

}

/**

* Itr.lastRet的值是-1,导致的异常,只有用next方法取过一次值,lastRet的值才不是初始化的-1

*/

private static void remove4() {

List list1 = new ArrayList<>(list);

Iterator iterator1 = list1.iterator();

while (iterator1.hasNext()) {

iterator1.remove();

}

System.out.println(list1);

}

/**

* modCount的值在调用ArrayList.remove的时候,会++

* 然后调用next的方法的时候,modCount和expectedModCount便不等了,导致的异常

*/

private static void remove3() {

List list3 = new ArrayList<>(list);

Iterator iterator1 = list3.iterator();

while (iterator1.hasNext()) {

Integer next = iterator1.next();

if (ok(next)) {

list3.remove(next);

}

}

System.out.println(list3);

}

private static void remove2() {

List list2 = new ArrayList<>(list);

Iterator iterator = list2.iterator();

while (iterator.hasNext()) {

Integer next = iterator.next();

if (ok(next)) {

iterator.remove();

}

}

System.out.println(list2);

}

private static void remove1() {

List list1 = new ArrayList<>(list);

for (int i = 0; i < list1.size(); i++) {

if (ok(list1.get(i))) {

list1.remove(list1.get(i));

}

}

System.out.println(list1);

}

private static boolean ok(int i) {

return i == 2;

}

}

CopyOnWriteArrayList(线程安全的):

List list = new CopyOnWriteArrayList<>();

list.add(2);

list.add(1);

Iterator iterator = list.iterator();

while (iterator.hasNext()) {

Integer student = iterator.next();

if (student == 1) {

iterator.remove();

}

}

使用以上代码的时候,会报

java.lang.UnsupportedOperationException

翻看源码,CopyOnWriteArrayList实现的迭代器COWInterator不支持add、set、remove操作,

不过可以直接用其remove方法或者removeAll方法来删除。

CopyOnWriteArraySet:

其增删改操作使用的是其内部维护的CopyOnWriteArrayList来实现的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值