一点一点看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 }

 

 

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

 

以上!

 

转载于:https://www.cnblogs.com/liuyuhangCastle/p/9623526.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值