zoukankan      html  css  js  c++  java
  • ArrayList类源码浅析(二)

    1、removeAll(Collection<?> c)和retainAll(Collection<?> c)方法

    第一个是从list中删除指定的匹配的集合元素,第二个方法是用指定的集合替换list;

    但是在这两方法中调用同一个batchRemove方法:

    2、内部类Sublist

    这个类继承自AbstractList抽象类,实现RandomAccess接口,类中的字段有

    这个类中的大部分的方法都是在调用ArrayList的方法:ArrayList.this.elementData(offset + index);

    且这个类的所有方法,都会调用:checkForComodification(),主要是判断ArrayList类中的modCount与SubList类中的modCount是否相等;

    如果这个两个值不相等,则抛出异常:throw new ConcurrentModificationException();

    Sublist类维护的数据域,其实就是外部类的数据域,对Sublist类的数据域进行修改,同时也修改了其外部的ArrayList类的数据域;

    这时可能就会出现问题,同时有两个对象在操作同一个数据域,存在线程安全的问题;

    如果一个线程在迭代ArrayList对象,另外一个线程在修改Sublist对象,就会抛出异常;

    3、内部类Itr和ListItr,两个内部类都是实现了Iterator接口,都是可迭代的

    ArrayList类中:iterator()方法,返回的其实是内部类Itr的对象;listIterator()方法,返回的是内部类ListItr的对象

    4、内部类Itr字段和方法

    cursor:一个游标,指向下一个将要返回的元素的下标;

    hasNext()方法:判断cursor和size是否相等,返回true或false

    next()方法:首先检查modCount 和 expectedModCount是否相等,如果不相等,抛出异常

    remove()方法:删除cursor游标指向的元素;

    5、内部类ListItr字段和方法

    继承自Itr类,拥有Itr所有的默认访问属性的字段和公有方法,然后对Itr类的功能进行了扩展,增加的方法有:

    previous():查找前一个元素

    还有:set(E e)、add(E e)等方法,都是调用的外部类的相对应的方法;

  • 相关阅读:
    可能是全网最详细的express--middleware
    带你学Node系列之express-CRUD
    简单聊聊ES6-Promise和Async
    Node学习图文教程之express重写留言本案例
    Node.js学习(第四章:初见express)
    彻底弄懂ES6中的Map和Set
    全网最easy的better-scroll实现上拉加载和下拉刷新
    Node中require第三方模块的规则
    canvas实现酷炫气泡效果
    Node.js实现用户评论社区(体验前后端开发的乐趣)
  • 原文地址:https://www.cnblogs.com/lianliang/p/5757832.html
Copyright © 2011-2022 走看看