zoukankan      html  css  js  c++  java
  • Java中ArrayList学习笔记

    1. 先看两段代码

    这段代码在执行的时候会报

    但是这样写就好着呢:

    总结,研究报错的代码 ,在for循环的时候调用next()方法,next方法中调用了checkForComodification这个方法,这个方法里面判断modCount和expectedModCount不相等的时候就抛出ConcurrentModificationException这个异常。

    原因:当for循环执行的时候首先调用了

    这个方法,这个方法初始化了expectedModCount=modCount,modCount的值是在add方法里面复制的,如当前程序为8,初始化给expectedModCount的值。当调用remove 方法的时候,将modCount++; 导致下一次循环的时候两个值不相同,就会报这个错误。

    这里还有个知识点:

    modCount 这个变量被transient关键字修饰,意思是不可被序列化。

    参考文档:https://www.cnblogs.com/chenpi/p/6185773.html

    2. 解决办法:

    for (int i = students.size() - 1; i >= 0; i--) {
    if (students.get(i).equals("李四")) {
    students.remove(i);
    }
    }
    注意倒叙删除。正序删除的时候由于size一直变小,可能后面的删除不了。
    Iterator<String> iterator = students.iterator();
    while (iterator.hasNext()) {
    if (iterator.next().equals("李四"))
    iterator.remove();
    }
    用iterator的remove方法可以删除,因为remove方法中将expectedModCount=modCount。

    2. 多线程问题

    这段代码在执行的时候有时候会报错,就是在方法内部调用 next方法的时候expectedModCount和modCount的值不一致引起的。

    解决方案:

    用CopyOnWriteArrayList方法,注意这个方法没有实现iterator.remove()。CopyOnWriteArrayList 里面在操作数据都用Lock进行了处理,但是有个方法getArray()没有lock。

    3.  ConcurrentHaspMap它也是线程安全的,它里面是通过synchronized实现的。

  • 相关阅读:
    iOS真机调试配置
    C语言-09-文件操作
    C语言-08-预处理器
    UILabel和NSAttributedString那些事
    验证码倒计时按钮
    验证码/密码按位分割输入框
    CocoaPods的安装和使用那些事(Xcode 7.2,iOS 9.2,Swift)
    UISearchBar改变搜索框的高度
    二维码名片的生成与读取
    设计模式-02-单例
  • 原文地址:https://www.cnblogs.com/baoyi/p/java_arrayList.html
Copyright © 2011-2022 走看看