• 一点一点看JDK源码(三)java.util.ArrayList 前偏


    一点一点看JDK源码(三)java.util.ArrayList

    liuyuhang原创,未经允许禁止转载

    本文举例使用的是JDK8的API

    目录:一点一点看JDK源码(〇)

    1.综述

      ArrayList是一个容量不固定的容器,为单列,有序集合,容量可扩容,扩容系数为1.5

      有最大值,一般达不到。

      ArrayList是线程不安全的,其扩容发生于集合修改的时候,如add,addAll等

      ArrayList底层使用的是Object数组,初始化内容为10个容量的元素

      使用ArrayList的时候,几种情况下实例化将更加提高效率

        ①仅仅使用基础增加功能作为容器临时使用

          List list = new ArrayList()

          这样可以使用较少的实例化方法

        ②使用ArrayList中的所有实例化方法时使用

          ArrayList list = new ArrayList()

          这样可以使用ArrayList所有的方法

        ③如果你能确定这个集合的容量,最好指定其容量,

          扩容也是一种算法,而且可能扩容多次,效率不高,如:

          ArrayList list = new ArrayList(22)

        ④如果该ArrayList的长度巨大,并且不确定,只用于容器临时使用

          建议使用LinkedList进行接收参数,然后再转化为ArrayList,如:

          LinkedList list = new LinkedList();

          //some operations

          ArrayList listArr = new ArrayList(list);

      

    2.关注点

    • Collection
    • List
    • LinkedList
    • Vector

      关注点

        Collection为父接口的父接口

        List为父接口

        LinkedList为List的链表实现,ArrayList为List的数组实现

        Vector几乎不去用,他是List的另一种数组实现,但是线程安全

      虽然类注释上的@see只有这些,但是个人认为,

      应该重点关注一下AbstractList抽象类,RandomAccess,Cloneable这两个接口,序列化接口关注度真心不高

      对于接口的实现关系,哪些是List通用的,哪些内容已经在AbstractList抽象类中已经定义了,应该过一下的

    3.源码解析

      放源码如下,注解有些删掉,对于类,内部类,方法,构造等进行了简要的说明注释

      内容比较多,建议慢慢看完,如果jdk1.8新增的看不懂,可以暂时搁置,略过

      我也不保证对于jdk1.8的部分注释是正确的。

       1 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
       2     /**
       3      * 序列化版本号
       4      */
       5     private static final long serialVersionUID = 8683452581122892189L;
       6     /**
       7      * 默认容量。
       8      */
       9     private static final int DEFAULT_CAPACITY = 10;
      10 
      11     /**
      12      * 以object数组作为类内共享实例容器。
      13      */
      14     private static final Object[] EMPTY_ELEMENTDATA = {};
      15 
      16     /**
      17      * 以object数组作为类内共享实例容器,使用默认容量实例化时使用。
      18      */
      19     private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
      20 
      21     /**
      22      * 以object数组作为容器缓自排序冲数组,注意没有private关键字,用于排序,当地一个元素添加的时候将转为默认容量
      23      */
      24     transient Object[] elementData; // non-private to simplify nested class access
      25 
      26     /**
      27      * 缓存的size大小,
      28      */
      29     private int size;
      30 
      31     /**
      32      * 带参构造,手动设置容器初始大小,若实例化时能确定大小,最好别使用默认扩展容量,将提高运行效率
      33      */
      34     public ArrayList(int initialCapacity) {
      35         if (initialCapacity > 0) {
      36             this.elementData = new Object[initialCapacity]; //使用自排序缓冲数组
      37         } else if (initialCapacity == 0) {
      38             this.elementData = EMPTY_ELEMENTDATA; //使用默认数组
      39         } else {
      40             throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); //容量扩充参数异常
      41         }
      42     }
      43 
      44     /**
      45      * 无参构造,使用默认容器初始化大小
      46      */
      47     public ArrayList() {
      48         this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
      49     }
      50 
      51     /**
      52      * 带参构造器,将参数集合用数组工具类转成数组,并存入缓冲数组,对缓冲数组进行校验.
      53 * 若转换后的数组并非object数组(内嵌套无法直接引用情况下),则使用数组工具类将该数组使用深度拷贝
      54      */
      55     public ArrayList(Collection<? extends E> c) {
      56         elementData = c.toArray();
      57         if ((size = elementData.length) != 0) {
      58             // c.toArray might (incorrectly) not return Object[] (see 6260652)
      59             if (elementData.getClass() != Object[].class)
      60                 elementData = Arrays.copyOf(elementData, size, Object[].class);
      61         } else {
      62             // replace with empty array.
      63             this.elementData = EMPTY_ELEMENTDATA;
      64         }
      65     }
      66 
      67     /**
      68      * 去除多余的数组申请空间,在内存紧张时会用到
      69      */
      70     public void trimToSize() {
      71         modCount++;//修改次数
      72         if (size < elementData.length) {
      73             elementData = (size == 0)
      74               ? EMPTY_ELEMENTDATA
      75               : Arrays.copyOf(elementData, size);
      76         }
      77     }
      78 
      79     /**
      80      * 对底层缓冲数组进行扩容的优化方法,如果已知该ArrayList容量,则可执行一次性扩容,
      81      * 否则将在数组add的过程中进行动态扩容,效率较低
      82      */
      83     public void ensureCapacity(int minCapacity) {
      84         int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)? 0: DEFAULT_CAPACITY;
      85         if (minCapacity > minExpand) {
      86             ensureExplicitCapacity(minCapacity);
      87         }
      88     }
      89     /**
      90      * 重新计算ArrayList的size,在使用构造和扩容时调用
      91      */
      92     private static int calculateCapacity(Object[] elementData, int minCapacity) {
      93         if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
      94             return Math.max(DEFAULT_CAPACITY, minCapacity);
      95         }
      96         return minCapacity;
      97     }
      98 
      99     /**
     100      * 被add调用,内部调用calculatecapacity,用于扩容
     101      */
     102     private void ensureCapacityInternal(int minCapacity) {
     103         ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
     104     }
     105 
     106     /**
     107      * 被ensureCapacity调用,内部调用calculatecapacity,用于扩容或优化
     108      */
     109     private void ensureExplicitCapacity(int minCapacity) {
     110         modCount++;
     111         // overflow-conscious code
     112         if (minCapacity - elementData.length > 0)
     113             grow(minCapacity);
     114     }
     115 
     116     /**
     117      * 目标分配数组的容器大小,最大值要小于Integer.MAX_VALUE-8
     118      */
     119     private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
     120 
     121     /**
     122      * 扩容
     123      */
     124     private void grow(int minCapacity) {
     125         int oldCapacity = elementData.length; //原容量
     126         int newCapacity = oldCapacity + (oldCapacity >> 1); //新容量,扩容1.5倍,自查>>位运算
     127         if (newCapacity - minCapacity < 0) //容量不足,则扩容
     128             newCapacity = minCapacity;
     129         if (newCapacity - MAX_ARRAY_SIZE > 0) //扩容超支,使用最大容
     130             newCapacity = hugeCapacity(minCapacity);
     131         // minCapacity is usually close to size, so this is a win:
     132         elementData = Arrays.copyOf(elementData, newCapacity);
     133     }
     134 /**
     135      * 被grow方法调用,扩容为最大
     136      */
     137     private static int hugeCapacity(int minCapacity) {
     138         if (minCapacity < 0) //参数错误,抛出异常
     139             throw new OutOfMemoryError();
     140         return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; //返回最大容量
     141     }
     142 
     143     /**
     144      * 获取当前size
     145      */
     146     public int size() {
     147         return size;
     148     }
     149 
     150     /**
     151      * 判断当前是size是否为0,容器是否为空
     152      */
     153     public boolean isEmpty() {
     154         return size == 0;
     155     }
     156 
     157     /**
     158      * 判断是否包含元素o,返回该元素的index是否大于等于0的判断,是为包含,否为不包含
     159      */
     160     public boolean contains(Object o) {
     161         return indexOf(o) >= 0;
     162     }
     163 
     164     /**
     165      * 获取查询元素的index,若备查元素为null,则寻找空元素,返回index
     166      * 若备查元素不为null,则使用equal判断该元素是否存在,并返回index
     167      * 不存在则返回-1
     168      * 被contains调用
     169      */
     170     public int indexOf(Object o) {
     171         if (o == null) {
     172             for (int i = 0; i < size; i++)
     173                 if (elementData[i]==null)
     174                     return i;
     175         } else {
     176             for (int i = 0; i < size; i++)
     177                 if (o.equals(elementData[i]))
     178                     return i;
     179         }
     180         return -1;
     181     }
     182 
     183     /**
     184      * 倒叙查询第一个出现的被查元素
     185      */
     186     public int lastIndexOf(Object o) {
     187         if (o == null) {
     188             for (int i = size-1; i >= 0; i--)
     189                 if (elementData[i]==null)
     190                     return i;
     191         } else {
     192             for (int i = size-1; i >= 0; i--)
     193                 if (o.equals(elementData[i]))
     194                     return i;
     195         }
     196         return -1;
     197     }
     198 
     199     /**
     200      * clone本实例数组,返回类型为Object,使用根类意为可转换为其他格式容器
     201      */
     202     public Object clone() {
     203         try {
     204             ArrayList<?> v = (ArrayList<?>) super.clone();
     205             v.elementData = Arrays.copyOf(elementData, size);
     206             v.modCount = 0;
     207             return v;
     208         } catch (CloneNotSupportedException e) {
     209             throw new InternalError(e);
     210         }
     211     }
     212 
     213     /**
     214      * 将本实例转换为object数组,调用数组工具类拷贝
     215      */
     216     public Object[] toArray() {
     217         return Arrays.copyOf(elementData, size);
     218     }
     219 
     220     /**
     221      * 将本实例转换为指定类型数组,调用数组工具类拷贝,并获得泛型的Class
     222      */
     223     @SuppressWarnings("unchecked")
     224     public <T> T[] toArray(T[] a) {
     225         if (a.length < size)
     226             // Make a new array of a's runtime type, but my contents:
     227             return (T[]) Arrays.copyOf(elementData, size, a.getClass());
     228         System.arraycopy(elementData, 0, a, 0, size);
     229         if (a.length > size)
     230             a[size] = null;
     231         return a;
     232     }
     233 
     234     /**
     235      * 获取指定index的元素,被get方法调用,get方法内进行check,util包内的类可调用
     236      */
     237     @SuppressWarnings("unchecked")
     238     E elementData(int index) {
     239         return (E) elementData[index];
     240     }
     241 
     242     /**
     243      * 获取指定元素的方法,使用rangeCheck进行index的check
     244      */
     245     public E get(int index) {
     246         rangeCheck(index);
     247         return elementData(index);
     248     }
     249 
     250     /**
     251      * 将指定index的值设置为指定值,使用rangeCheck进行index的check
     252      */
     253     public E set(int index, E element) {
     254         rangeCheck(index);
     255         E oldValue = elementData(index);
     256         elementData[index] = element;
     257         return oldValue;
     258     }
     259 
     260     /**
     261      * 容量+1的,在容器尾部添加元素
     262      */
     263     public boolean add(E e) {
     264         ensureCapacityInternal(size + 1);  // Increments modCount!!
     265         elementData[size++] = e; // 这个在数组尾部追加元素的写法很好用,前提是扩容
     266         return true; // 有返回值的,应当接收
     267     }
     268 
     269     /**
     270      * 在指定index添加指定元素,首先使用rangeCheckForAdd进行check,为保证数组操作的正确性,使用arraycopy来移动数组元素
     271      */
     272     public void add(int index, E element) {
     273         rangeCheckForAdd(index);
     274         ensureCapacityInternal(size + 1);  // Increments modCount!!
     275         System.arraycopy(elementData, index, elementData, index + 1, size - index);
     276         elementData[index] = element;
     277         size++;
     278     }
     279 
     280     /**
     281      * remove指定index的元素,并重构本实例
     282      */
     283     public E remove(int index) {
     284         rangeCheck(index);
     285         modCount++;
     286         E oldValue = elementData(index);
     287         int numMoved = size - index - 1;
     288         if (numMoved > 0)
     289             System.arraycopy(elementData, index+1, elementData, index, numMoved);
     290         elementData[--size] = null; // clear to let GC do its work
     291         return oldValue;
     292     }
     293 
     294     /**
     295      * remove指定元素,返回是否找到该元素并移除成功的boolean标记
     296      */
     297     public boolean remove(Object o) {
     298         if (o == null) {
     299             for (int index = 0; index < size; index++)
     300                 if (elementData[index] == null) {
     301                     fastRemove(index);
     302                     return true;
     303                 }
     304         } else {
     305             for (int index = 0; index < size; index++)
     306                 if (o.equals(elementData[index])) {
     307                     fastRemove(index);
     308                     return true;
     309                 }
     310         }
     311         return false;
     312     }
     313 
     314     /*
     315      * 内部使用,快速移除指定index的元素
     316      */
     317     private void fastRemove(int index) {
     318         modCount++;
     319         int numMoved = size - index - 1;
     320         if (numMoved > 0)
     321             System.arraycopy(elementData, index+1, elementData, index,
     322                              numMoved);
     323         elementData[--size] = null; // clear to let GC do its work
     324     }
     325 
     326     /**
     327      * 清除本实例内部的所有元素,加速gc回收
     328      */
     329     public void clear() {
     330         modCount++;
     331         // clear to let GC do its work
     332         for (int i = 0; i < size; i++)
     333             elementData[i] = null;
     334         size = 0;
     335     }
     336 
     337     /**
     338      * 添加指定集合到本实例中Object数组末尾
     339      */
     340     public boolean addAll(Collection<? extends E> c) {
     341         Object[] a = c.toArray();
     342         int numNew = a.length;
     343         ensureCapacityInternal(size + numNew);  // Increments modCount
     344         System.arraycopy(a, 0, elementData, size, numNew);
     345         size += numNew;
     346         return numNew != 0;
     347     }
     348 
     349     /**
     350      * 从指定元素开始添加指定集合到本实例
     351      */
     352     public boolean addAll(int index, Collection<? extends E> c) {
     353         rangeCheckForAdd(index);
     354         Object[] a = c.toArray();
     355         int numNew = a.length;
     356         ensureCapacityInternal(size + numNew);  // Increments modCount
     357         int numMoved = size - index;
     358         if (numMoved > 0)
     359             System.arraycopy(elementData, index, elementData, index + numNew,
     360                              numMoved);
     361         System.arraycopy(a, 0, elementData, index, numNew);
     362         size += numNew;
     363         return numNew != 0;
     364     }
     365 
     366     /**
     367      * 本类和子类可使用,移除指定范围的index的所有元素
     368      */
     369     protected void removeRange(int fromIndex, int toIndex) {
     370         modCount++;
     371         int numMoved = size - toIndex;
     372         System.arraycopy(elementData, toIndex, elementData, fromIndex, numMoved);
     373         int newSize = size - (toIndex-fromIndex);
     374         for (int i = newSize; i < size; i++) {
     375             elementData[i] = null;
     376         }
     377         size = newSize;
     378     }
     379 
     380     /**
     381      * 内部的index超限检测方法,当index超过size的时候,抛出index超限异常,在本类中被多次调用
     382      */
     383     private void rangeCheck(int index) {
     384         if (index >= size)
     385             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
     386     }
     387 
     388     /**
     389      * 同上,但是在add和addAll中专用
     390      */
     391     private void rangeCheckForAdd(int index) {
     392         if (index > size || index < 0)
     393             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
     394     }
     395 
     396     /**
     397      * index超限抛异常时使用,用来提示size和index的值
     398      */
     399     private String outOfBoundsMsg(int index) {
     400         return "Index: "+index+", Size: "+size;
     401     }
     402 
     403     /**
     404      * 从本类实例中移除指定集合中所有元素的方法,返回值应接收
     405      */
     406     public boolean removeAll(Collection<?> c) {
     407         Objects.requireNonNull(c);
     408         return batchRemove(c, false);
     409     }
     410 
     411     /**
     412      * 从本类实例中保留指定集合中所有元素的方法,与removeAll相反
     413      */
     414     public boolean retainAll(Collection<?> c) {
     415         Objects.requireNonNull(c);
     416         return batchRemove(c, true);
     417     }
     418 
     419     /**
     420      * 内部调用,如果参数集合发生更改,则返回true
     421      */
     422     private boolean batchRemove(Collection<?> c, boolean complement) {
     423         final Object[] elementData = this.elementData; //获取本实例的所有元素
     424         int r = 0, w = 0; //r用于遍历,w用于记录相同元素的数量,也用于记录容器的扩容标记
     425         boolean modified = false; //标志位
     426         try {
     427             for (; r < size; r++)
     428                 if (c.contains(elementData[r]) == complement) //判断该元素是否被包含
     429                     elementData[w++] = elementData[r]; //包含则w++
     430         } finally {
     431             // Preserve behavioral compatibility with AbstractCollection,
     432             // even if c.contains() throws.
     433             if (r != size) {//集合有变化
     434                 System.arraycopy(elementData, r, elementData, w, size - r);
     435                 w += size - r;
     436             }
     437             if (w != size) {//容量不相等
     438                 // clear to let GC do its work
     439                 for (int i = w; i < size; i++)
     440                     elementData[i] = null;
     441                 modCount += size - w;
     442                 size = w;
     443                 modified = true; //容量有变化,说明有交集,则返回true
     444             }
     445         }
     446         return modified;
     447     }
     448 
     449     /**
     450      * 将本实例对象写入流中,实际上只写入了modCount,size和element[i],其余的内容在实例化时候是不必要的,或者可恢复的
     451      */
     452     private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{
     453         // Write out element count, and any hidden stuff
     454         int expectedModCount = modCount;
     455         s.defaultWriteObject();
     456         // Write out size as capacity for behavioural compatibility with clone()
     457         s.writeInt(size);
     458         // Write out all elements in the proper order.
     459         for (int i=0; i<size; i++) {
     460             s.writeObject(elementData[i]);
     461         }
     462         if (modCount != expectedModCount) {
     463             throw new ConcurrentModificationException();
     464         }
     465     }
     466 
     467     /**
     468      * 从流中读取本实例对象
     469      */
     470     private void readObject(java.io.ObjectInputStream s)
     471         throws java.io.IOException, ClassNotFoundException {
     472         elementData = EMPTY_ELEMENTDATA
     473         // Read in size, and any hidden stuff
     474         s.defaultReadObject();
     475         // Read in capacity
     476         s.readInt(); // ignored
     477         if (size > 0) {
     478             // be like clone(), allocate array based upon size not capacity
     479             int capacity = calculateCapacity(elementData, size);
     480             SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, capacity);
     481             ensureCapacityInternal(size);
     482             Object[] a = elementData;
     483             // Read in all elements in the proper order.
     484             for (int i=0; i<size; i++) {
     485                 a[i] = s.readObject();
     486             }
     487         }
     488     }
     489 
     490     /**
     491      * 获得指定长度额本实例的List迭代器
     492      */
     493     public ListIterator<E> listIterator(int index) {
     494         if (index < 0 || index > size)
     495             throw new IndexOutOfBoundsException("Index: "+index);
     496         return new ListItr(index);
     497     }
     498 
     499     /**
     500      * 获得本实例的默认List迭代器
     501      */
     502     public ListIterator<E> listIterator() {
     503         return new ListItr(0);
     504     }
     505 
     506     /**
     507      * 获得本实例的默认迭代器
     508      */
     509     public Iterator<E> iterator() {
     510         return new Itr();
     511     }
     512 
     513     /**
     514      * 内部使用的迭代器,重写自Iterator接口,为内部类
     515      */
     516     private class Itr implements Iterator<E> {
     517         int cursor;       // index of next element to return    迭代器指针
     518         int lastRet = -1; // index of last element returned; -1 if no such    末尾标记
     519         int expectedModCount = modCount;
     520         Itr() {}
     521         public boolean hasNext() {
     522             return cursor != size;
     523         }
     524         @SuppressWarnings("unchecked")
     525       //重写迭代器提供next方法,可能unchecked报错
     526         public E next() {
     527             checkForComodification();
     528             int i = cursor;
     529             if (i >= size)
     530                 throw new NoSuchElementException();
     531             Object[] elementData = ArrayList.this.elementData;
     532             if (i >= elementData.length)
     533                 throw new ConcurrentModificationException();
     534             cursor = i + 1;
     535             return (E) elementData[lastRet = i];
     536         }
     537       //重写迭代器提供remove方法
     538         public void remove() {
     539             if (lastRet < 0)
     540                 throw new IllegalStateException();
     541             checkForComodification();
     542             try {
     543                 ArrayList.this.remove(lastRet);
     544                 cursor = lastRet;
     545                 lastRet = -1;
     546                 expectedModCount = modCount;
     547             } catch (IndexOutOfBoundsException ex) {
     548                 throw new ConcurrentModificationException();
     549             }
     550         }
     551 
     552         @Override
     553         @SuppressWarnings("unchecked")//重写迭代器接口下的forEachRemaining方法,可能unchecked报错,可使用lambda迭代
     554         public void forEachRemaining(Consumer<? super E> consumer) {
     555             Objects.requireNonNull(consumer);
     556             final int size = ArrayList.this.size;
     557             int i = cursor;
     558             if (i >= size) {
     559                 return;
     560             }
     561             final Object[] elementData = ArrayList.this.elementData;
     562             if (i >= elementData.length) {
     563                 throw new ConcurrentModificationException();
     564             }
     565             while (i != size && modCount == expectedModCount) {
     566                 consumer.accept((E) elementData[i++]);
     567             }
     568             // update once at end of iteration to reduce heap write traffic
     569             cursor = i;
     570             lastRet = i - 1;
     571             checkForComodification();
     572         }
     573       //校验modCount修改次数的方法
     574         final void checkForComodification() {
     575             if (modCount != expectedModCount)
     576                 throw new ConcurrentModificationException();
     577         }
     578     }
     579 
     580     /**
     581      * 另一个内部提供ListItr的迭代器,继承自上述内部类,实现ListIteraotr接口,本内部类将允许使用固定长度的迭代器
     582      */
     583     private class ListItr extends Itr implements ListIterator<E> {
     584         ListItr(int index) {
     585             super();
     586             cursor = index;
     587         }
     588       //是否有前一个元素
     589         public boolean hasPrevious() {
     590             return cursor != 0;
     591         }
     592       //获取下一个index
     593         public int nextIndex() {
     594             return cursor;
     595         }
     596       //获取前一个index
     597         public int previousIndex() {
     598             return cursor - 1;
     599         }
     600       //获取前一个元素,可能因为unchecked报错
     601         @SuppressWarnings("unchecked")
     602         public E previous() {
     603             checkForComodification();
     604             int i = cursor - 1;
     605             if (i < 0)
     606                 throw new NoSuchElementException();
     607             Object[] elementData = ArrayList.this.elementData;
     608             if (i >= elementData.length)
     609                 throw new ConcurrentModificationException();
     610             cursor = i;
     611             return (E) elementData[lastRet = i];
     612         }
     613       //对迭代器内当index的元素设置为指定值
     614         public void set(E e) {
     615             if (lastRet < 0)
     616                 throw new IllegalStateException();
     617             checkForComodification();
     618             try {
     619                 ArrayList.this.set(lastRet, e);
     620             } catch (IndexOutOfBoundsException ex) {
     621                 throw new ConcurrentModificationException();
     622             }
     623         }
     624 
     625         public void add(E e) {
     626             checkForComodification();
     627 
     628             try {
     629                 int i = cursor;
     630                 ArrayList.this.add(i, e);
     631                 cursor = i + 1;
     632                 lastRet = -1;
     633                 expectedModCount = modCount;
     634             } catch (IndexOutOfBoundsException ex) {
     635                 throw new ConcurrentModificationException();
     636             }
     637         }
     638     }
     639 
     640     /**
     641      * 从fromIndex到toIndex拆分数组,内部调用subListRangeCheck方法对本实例进行check
     642      */
     643     public List<E> subList(int fromIndex, int toIndex) {
     644         subListRangeCheck(fromIndex, toIndex, size);
     645         return new SubList(this, 0, fromIndex, toIndex); //调用复写的内部类,十分巨大
     646     }
     647 /**
     648      * 被内部调用,进行拆分时的参数check校验
     649      */
     650     static void subListRangeCheck(int fromIndex, int toIndex, int size) {
     651         if (fromIndex < 0)
     652             throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
     653         if (toIndex > size)
     654             throw new IndexOutOfBoundsException("toIndex = " + toIndex);
     655         if (fromIndex > toIndex)
     656             throw new IllegalArgumentException("fromIndex(" + fromIndex +") > toIndex(" + toIndex + ")");
     657     }
     658 
     659 /**
     660      * 重写继承的AbstractList中的SubList类,对于该类提供和list基本相同的功能进行重新封装
     661      */
     662     private class SubList extends AbstractList<E> implements RandomAccess {
     663         private final AbstractList<E> parent;
     664         private final int parentOffset;
     665         private final int offset;
     666         int size;
     667       //构造
     668         SubList(AbstractList<E> parent,
     669                 int offset, int fromIndex, int toIndex) {
     670             this.parent = parent;
     671             this.parentOffset = fromIndex;
     672             this.offset = offset + fromIndex;
     673             this.size = toIndex - fromIndex;
     674             this.modCount = ArrayList.this.modCount;
     675         }
     676       //内部类的set方法
     677         public E set(int index, E e) {
     678             rangeCheck(index);
     679             checkForComodification();
     680             E oldValue = ArrayList.this.elementData(offset + index);
     681             ArrayList.this.elementData[offset + index] = e;
     682             return oldValue;
     683         }
     684       //内部类的get方法
     685         public E get(int index) {
     686             rangeCheck(index);
     687             checkForComodification();
     688             return ArrayList.this.elementData(offset + index);
     689         }
     690        //内部类的size方法
     691         public int size() {
     692             checkForComodification();//复用
     693             return this.size;
     694         }
     695       //内部类的add方法
     696         public void add(int index, E e) {
     697             rangeCheckForAdd(index); //复用
     698             checkForComodification();//复用
     699             parent.add(parentOffset + index, e);
     700             this.modCount = parent.modCount;
     701             this.size++;
     702         }
     703       //内部类的remove方法
     704         public E remove(int index) {
     705             rangeCheck(index); //复用
     706             checkForComodification();//复用
     707             E result = parent.remove(parentOffset + index);
     708             this.modCount = parent.modCount;
     709             this.size--;
     710             return result;
     711         }
     712       //从本内部类实例中移除指定范围的元素并重构本实例
     713         protected void removeRange(int fromIndex, int toIndex) {
     714             checkForComodification();//复用
     715             parent.removeRange(parentOffset + fromIndex,
     716                                parentOffset + toIndex); //使用父类
     717             this.modCount = parent.modCount;
     718             this.size -= toIndex - fromIndex;
     719         }
     720       //内部类的addAll
     721         public boolean addAll(Collection<? extends E> c) {
     722             return addAll(this.size, c);
     723         }
     724       //内部类的addAll,从指定index开始
     725         public boolean addAll(int index, Collection<? extends E> c) {
     726             rangeCheckForAdd(index); //复用
     727             int cSize = c.size();
     728             if (cSize==0)
     729                 return false;
     730             checkForComodification();//复用
     731             parent.addAll(parentOffset + index, c);
     732             this.modCount = parent.modCount;
     733             this.size += cSize;
     734             return true;
     735         }
     736       //内部类的迭代器
     737         public Iterator<E> iterator() {
     738             return listIterator();
     739         }
     740       //内部类的迭代器,被内部调用
     741         public ListIterator<E> listIterator(final int index) {
     742             checkForComodification();//复用
     743             rangeCheckForAdd(index); //复用
     744             final int offset = this.offset;
     745             return new ListIterator<E>() {
     746                 int cursor = index;
     747                 int lastRet = -1;
     748                 int expectedModCount = ArrayList.this.modCount;
     749                 public boolean hasNext() {
     750                     return cursor != SubList.this.size;
     751                 }
     752             //内部类的迭代器的next
     753                 @SuppressWarnings("unchecked")
     754                 public E next() {
     755                     checkForComodification();
     756                     int i = cursor;
     757                     if (i >= SubList.this.size)
     758                         throw new NoSuchElementException();
     759                     Object[] elementData = ArrayList.this.elementData;
     760                     if (offset + i >= elementData.length)
     761                         throw new ConcurrentModificationException();
     762                     cursor = i + 1;
     763                     return (E) elementData[offset + (lastRet = i)];
     764                 }
     765             //内部类的迭代器的判断是否有前一个元素
     766                 public boolean hasPrevious() {
     767                     return cursor != 0;
     768                 }
     769             //内部类的获取前一个元素
     770                 @SuppressWarnings("unchecked")
     771                 public E previous() {
     772                     checkForComodification();
     773                     int i = cursor - 1;
     774                     if (i < 0)
     775                         throw new NoSuchElementException();
     776                     Object[] elementData = ArrayList.this.elementData;
     777                     if (offset + i >= elementData.length)
     778                         throw new ConcurrentModificationException();
     779                     cursor = i;
     780                     return (E) elementData[offset + (lastRet = i)];
     781                 }
     782             //剩余元素的迭代,可以使用lambda表达式进行遍历
     783                 @SuppressWarnings("unchecked")
     784                 public void forEachRemaining(Consumer<? super E> consumer) {
     785                     Objects.requireNonNull(consumer);
     786                     final int size = SubList.this.size;
     787                     int i = cursor;
     788                     if (i >= size) {
     789                         return;
     790                     }
     791                     final Object[] elementData = ArrayList.this.elementData;
     792                     if (offset + i >= elementData.length) {
     793                         throw new ConcurrentModificationException();
     794                     }
     795                     while (i != size && modCount == expectedModCount) {
     796                         consumer.accept((E) elementData[offset + (i++)]);
     797                     }
     798                     // update once at end of iteration to reduce heap write traffic
     799                     lastRet = cursor = i;
     800                     checkForComodification();
     801                 }
     802             //内部类的迭代器中获取下一个元素的index
     803                 public int nextIndex() {
     804                     return cursor;
     805                 }
     806             //内部类的迭代器中获取上一个元素的index
     807                 public int previousIndex() {
     808                     return cursor - 1;
     809                 }
     810             //内部类的迭代器中移除当前元素
     811                 public void remove() {
     812                     if (lastRet < 0)
     813                         throw new IllegalStateException();
     814                     checkForComodification();
     815                     try {
     816                         SubList.this.remove(lastRet);
     817                         cursor = lastRet;
     818                         lastRet = -1;
     819                         expectedModCount = ArrayList.this.modCount;
     820                     } catch (IndexOutOfBoundsException ex) {
     821                         throw new ConcurrentModificationException();
     822                     }
     823                 }
     824             //内部类的迭代器对当前元素设置成指定值
     825                 public void set(E e) {
     826                     if (lastRet < 0)
     827                         throw new IllegalStateException();
     828                     checkForComodification();
     829                     try {
     830                         ArrayList.this.set(offset + lastRet, e);
     831                     } catch (IndexOutOfBoundsException ex) {
     832                         throw new ConcurrentModificationException();
     833                     }
     834                 }
     835             //内部类的迭代器中add方法添加元素到迭代器末尾
     836                 public void add(E e) {
     837                     checkForComodification();
     838                     try {
     839                         int i = cursor;
     840                         SubList.this.add(i, e);
     841                         cursor = i + 1;
     842                         lastRet = -1;
     843                         expectedModCount = ArrayList.this.modCount;
     844                     } catch (IndexOutOfBoundsException ex) {
     845                         throw new ConcurrentModificationException();
     846                     }
     847                 }
     848             //内部类的modCount校验
     849                 final void checkForComodification() {
     850                     if (expectedModCount != ArrayList.this.modCount)
     851                         throw new ConcurrentModificationException();
     852                 }
     853             };
     854         }
     855       
     856 /**
     857          * 内部类的拆分list的方法
     858          */
     859         public List<E> subList(int fromIndex, int toIndex) {
     860             subListRangeCheck(fromIndex, toIndex, size);
     861             return new SubList(this, offset, fromIndex, toIndex);
     862         }
     863       /**
     864             * 内部类的index越界检查方法
     865          */
     866         private void rangeCheck(int index) {
     867             if (index < 0 || index >= this.size)
     868                 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
     869         }
     870       /**
     871             * 同上,add和addAll专用
     872          */
     873         private void rangeCheckForAdd(int index) {
     874             if (index < 0 || index > this.size)
     875                 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
     876         }
     877       /**
     878             * 内部类rangeCheckForAdd中抛异常调用,写明index和size
     879          */
     880         private String outOfBoundsMsg(int index) {
     881             return "Index: "+index+", Size: "+this.size;
     882         }
     883       /**
     884             * 内部类的modCount校验
     885          */
     886         private void checkForComodification() {
     887             if (ArrayList.this.modCount != this.modCount)
     888                 throw new ConcurrentModificationException();
     889         }
     890       /**
     891             * 内部类的分离迭代器函数,调用ArrayList的ArrayListSpliterator内部类的构造器
     892          */
     893         public Spliterator<E> spliterator() {
     894             checkForComodification();
     895             return new ArrayListSpliterator<E>(ArrayList.this, offset, offset + this.size, this.modCount);
     896         }
     897     }
     898 
     899 /**
     900      * 重写继承的forEach方法,用于迭代
     901      */
     902     @Override
     903     public void forEach(Consumer<? super E> action) {
     904         Objects.requireNonNull(action);
     905         final int expectedModCount = modCount;
     906         @SuppressWarnings("unchecked")
     907         final E[] elementData = (E[]) this.elementData;
     908         final int size = this.size;
     909         for (int i=0; modCount == expectedModCount && i < size; i++) {
     910             action.accept(elementData[i]);
     911         }
     912         if (modCount != expectedModCount) {
     913             throw new ConcurrentModificationException();
     914         }
     915     }
     916 
     917     /**
     918      * jd1.8更新
     919      * 重写自父类,分离数组,默认使用本类内容,从0-末尾,
     920      */
     921     @Override
     922     public Spliterator<E> spliterator() {
     923         return new ArrayListSpliterator<>(this, 0, -1, 0);
     924     }
     925 
     926     /**
     927      * jd1.8更新
     928      * 重写自父类,实现Spliterator接口
     929      * 本类用于分离ArrayList,前提是ArrayList暂定是不变的,否则将可能出现线程错误
     930      */
     931     static final class ArrayListSpliterator<E> implements Spliterator<E> {
     932 
     933         private final ArrayList<E> list;
     934         private int index; // current index, modified on advance/split
     935         private int fence; // -1 until used; then one past last index
     936         private int expectedModCount; // initialized when fence set
     937 
     938        /**
     939          * 内部类ArrayListSpliterator的构造器
     940          */
     941         ArrayListSpliterator(ArrayList<E> list, int origin, int fence,
     942                              int expectedModCount) {
     943             this.list = list; // OK if null unless traversed
     944             this.index = origin;
     945             this.fence = fence;
     946             this.expectedModCount = expectedModCount;
     947         }
     948        /**
     949          * 内部类ArrayListSpliterator中很多方法都使用的初始化方法
     950          */
     951         private int getFence() { // initialize fence to size on first use
     952             int hi; // (a specialized variant appears in method forEach)
     953             ArrayList<E> lst;
     954             if ((hi = fence) < 0) {
     955                 if ((lst = list) == null)
     956                     hi = fence = 0;
     957                 else {
     958                     expectedModCount = lst.modCount;
     959                     hi = fence = lst.size;
     960                 }
     961             }
     962             return hi;
     963         }
     964        /**
     965          * 内部类ArrayListSpliterator的拆分arraylist方法,不保证结果正确
     966          */
     967         public ArrayListSpliterator<E> trySplit() {
     968             int hi = getFence(), lo = index, mid = (lo + hi) >>> 1;
     969             return (lo >= mid) ? null : // divide range in half unless too small
     970                 new ArrayListSpliterator<E>(list, lo, index = mid, expectedModCount);
     971         }
     972 
     973        /**
     974          * 内部类ArrayListSpliterator的预拆分?尝试是否能够拆分
     975          */
     976         public boolean tryAdvance(Consumer<? super E> action) {
     977             if (action == null)
     978                 throw new NullPointerException();
     979             int hi = getFence(), i = index;
     980             if (i < hi) {
     981                 index = i + 1;
     982                 @SuppressWarnings("unchecked") E e = (E)list.elementData[i];
     983                 action.accept(e);
     984                 if (list.modCount != expectedModCount)
     985                     throw new ConcurrentModificationException();
     986                 return true;
     987             }
     988             return false;
     989         }
     990 
     991        /**
     992          * 内部类ArrayListSpliterator迭代
     993          */
     994         public void forEachRemaining(Consumer<? super E> action) {
     995             int i, hi, mc; // hoist accesses and checks from loop
     996             ArrayList<E> lst; Object[] a;
     997             if (action == null)
     998                 throw new NullPointerException();
     999             if ((lst = list) != null && (a = lst.elementData) != null) {
    1000                 if ((hi = fence) < 0) {
    1001                     mc = lst.modCount;
    1002                     hi = lst.size;
    1003                 }
    1004                 else
    1005                     mc = expectedModCount;
    1006                 if ((i = index) >= 0 && (index = hi) <= a.length) {
    1007                     for (; i < hi; ++i) {
    1008                         @SuppressWarnings("unchecked") E e = (E) a[i];
    1009                         action.accept(e);
    1010                     }
    1011                     if (lst.modCount == mc)
    1012                         return;
    1013                 }
    1014             }
    1015             throw new ConcurrentModificationException();
    1016         }
    1017       //内部类ArrayListSpliterator的size预估
    1018         public long estimateSize() {
    1019             return (long) (getFence() - index);
    1020         }
    1021 
    1022       //分离参数初始化
    1023         public int characteristics() {
    1024             return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED;
    1025         }
    1026     }
    1027 
    1028     /**
    1029      * 重写自父类,使用重写的filter接口进行筛选,符合条件的则移除
    1030      */
    1031     @Override
    1032     public boolean removeIf(Predicate<? super E> filter) {
    1033         Objects.requireNonNull(filter);
    1034         // figure out which elements are to be removed
    1035         // any exception thrown from the filter predicate at this stage
    1036         // will leave the collection unmodified
    1037         int removeCount = 0;
    1038         final BitSet removeSet = new BitSet(size);
    1039         final int expectedModCount = modCount;
    1040         final int size = this.size;
    1041         for (int i=0; modCount == expectedModCount && i < size; i++) {
    1042             @SuppressWarnings("unchecked")
    1043             final E element = (E) elementData[i];
    1044             if (filter.test(element)) {
    1045                 removeSet.set(i);
    1046                 removeCount++;
    1047             }
    1048         }
    1049         if (modCount != expectedModCount) {
    1050             throw new ConcurrentModificationException();
    1051         }
    1052 
    1053         // shift surviving elements left over the spaces left by removed elements
    1054         final boolean anyToRemove = removeCount > 0;
    1055         if (anyToRemove) {
    1056             final int newSize = size - removeCount;
    1057             for (int i=0, j=0; (i < size) && (j < newSize); i++, j++) {
    1058                 i = removeSet.nextClearBit(i);
    1059                 elementData[j] = elementData[i];
    1060             }
    1061             for (int k=newSize; k < size; k++) {
    1062                 elementData[k] = null;  // Let gc do its work
    1063             }
    1064             this.size = newSize;
    1065             if (modCount != expectedModCount) {
    1066                 throw new ConcurrentModificationException();
    1067             }
    1068             modCount++;
    1069         }
    1070         return anyToRemove;
    1071     }
    1072 
    1073    /**
    1074      * 重写自父类,使用重写的operator接口进行替代本实例中匹配的元素
    1075      */
    1076     @Override
    1077     @SuppressWarnings("unchecked")
    1078     public void replaceAll(UnaryOperator<E> operator) {
    1079         Objects.requireNonNull(operator);
    1080         final int expectedModCount = modCount;
    1081         final int size = this.size;
    1082         for (int i=0; modCount == expectedModCount && i < size; i++) {
    1083             elementData[i] = operator.apply((E) elementData[i]);
    1084         }
    1085         if (modCount != expectedModCount) {
    1086             throw new ConcurrentModificationException();
    1087         }
    1088         modCount++;
    1089     }
    1090 
    1091    /**
    1092      * 重写自父类,使用comparator接口对本实例进行排序
    1093      */
    1094     @Override
    1095     @SuppressWarnings("unchecked")
    1096     public void sort(Comparator<? super E> c) {
    1097         final int expectedModCount = modCount;
    1098         Arrays.sort((E[]) elementData, 0, size, c);
    1099         if (modCount != expectedModCount) {
    1100             throw new ConcurrentModificationException();
    1101         }
    1102         modCount++;
    1103     }
    1104 }

      本篇注释前偏,只是粗略的了解,中篇 和 后篇 将对其中的使用进行总结和举例。

    以上!

  • 相关阅读:
    CDOJ 1059 秋实大哥与小朋友 STL(set)+离散化+BIT区间更新单点查询
    hdu 1754 线段树 水题 单点更新 区间查询
    ZOJ 2301 离散化
    hdu 1166 线段树 区间求和 +单点更新 CD模板
    UVA 12299 线段树 ( 单点跟新 , 区间查询)
    TTTTTTTTTTTTT LA 2191 树状数组 稍修改
    TTTTTTTTTTT LA 4329 BIT模版
    POJ 1912 凸包
    对django模型中的objects的理解
    巨蟒python全栈开发django4:url反向解析图解&&模板渲染2
  • 原文地址:https://www.cnblogs.com/liuyuhangCastle/p/9623526.html
Copyright © 2020-2023  润新知