ArrayList需要注意的地方

  1. ArrayList中的modCount参数有什么用?

    This field is used by the iterator and list iterator implementation returned by the iterator and listIterator methods. If the value of this field changes unexpectedly, the iterator (or list iterator) will throw a ConcurrentModificationException in response to the {@code next}, {@code remove}, {@code previous} {@code set} or {@code add} operations. This provides fail-fast behavior, rather than non-deterministic behavior in the face of concurrent modification during iteration.

    • 翻译过来就是说如果在遍历期间,数组被更改的话会直接返回一个ConcurrentModificationException异常,看名称就知道是并发操作时导致的一个错误 ,它提供了一个快速失败的功能,而不是迭代期间面对并发修改时的不确定性.

      public class TestList {
      public static void main(String[] args) {
      ArrayList<Integer> list=new ArrayList<>();
      list.add(10);
      list.add(5);
      Iterator<Integer> iterator=list.iterator();
      while(iterator.hasNext()){
      Integer i=iterator.next();
      if(i==5){
      list.remove(i);  //注意这里
      }
      }
      }
      }

      会报ConcurrentModificationException异常. Exception in thread “main” java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at TestList.main(TestList.java:13)

      之前分析源码时说过,在调用remove中的fastRemove方法时会让modCount++,迭代器发现modCount发生变化时会直接抛出异常. 事实上当我们remove掉5时,此时size=1,而此时的iterator的游标cursor为2,hasNext为true,while循环继续跑了,此时运行iterator.next()肯定会报ArrayIndexOutOfBoundsException,这种异常属于不受检查异常,因此为了避免这样,jdk做了一些检查.

      public boolean hasNext() {
      return cursor != size;
      }

这段代码能执行成功吗?

public class TestList {
  public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
      list.add("lovexl" + i);
    }
    for (int i = 0; list.iterator().hasNext(); i++) {
      list.remove(i);
      System.out.println(list.size());
      System.out.println(list.get(i));
    }
  }
}

会报IndexOutOfBoundsException错误. hasNext的判断条件就是游标是否到达数组的尾端,当游标已经到达数组尾端了,你删了一个数,size–了,那游标就永远不可能等于size了,往后遍历就只能报IndexOutOfBoundsException错误


本网站发布的一切文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请联系邮箱:1194325527@qq.com处理

目录
×

给作者杯卡布奇诺

github