zoukankan      html  css  js  c++  java
  • 顺序存储线性表_ArrayList

      相信大家在日常开发过程中 List 应该使用的非常非常多,今天就来简单学习一下 List 的数据结构 顺序存储线性表。

    一、什么是顺序存储线性表

      顺序存储线性表是最基本、最简单、也是最常用的一种数据结构。

      线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点)。

      顺序存储线性表的相邻元素之间存在着序偶关系。如用(a1,…,ai-1,ai,ai+1,…,an)表示一个顺序表,则表中 ai-1 领先于 ai,ai 领先于 ai+1,称 ai-1 是 ai 的直接前驱元素,ai+1 是 ai 的直接后继元素。当 i=1,2,…,n-1 时,ai 有且仅有一个直接后继,当 i=2,3,…,n 时,ai 有且仅有一个直接前驱,n 为线性表的长度,如果 n==0 时,线性表为空表

    二、顺序存储线性表的特征

      绝大多数的顺序存储线性表都有一下几个特征:

      ①. 线性表中都会存在唯一的一个 "首元素"。

      ②. 线性表中都会存在唯一的一个"尾元素"。

      ③. 线性表除最后一个元素外都存在"后继"。

      ④. 线性表除第一个元素外都存在"前驱"。

      ⑤. 存储位置连续,可以很方便的计算出各个元素的地址。

      如果每个元素占用的存储单元为 C ,那么:

        Loc(An) = Loc(An-1) + C

        Loc(An) = Loc(A1) + (n - 1)* C

    三、JDK源码解读

      在 java 中,ArrayList 是典型的顺序存储线性表,下面来解读一下JDK 1.8 中 ArrayList 源码中的方法,以及父类,接口中的一些方法。

       首先,进入到 ArrayList 中,简单看了一下ArrayList 的继承关系,ArrayList 继承 AbstractList, AbstractList 继承 AbstractCollection 类,实现了 List 接口, AbstractCollection 类实现了 Collection 接口,而 List 继承了 Collection 接口, Collection  继承了 Iterable 接口,下面就依次来简单解读这些接口以及类的实现方法以及作用。

      ArrayList 与它的父类接口的关系图:

      ①. Iterable 接口

        用途:Iterable 接口是 java 中的顶级接口之一,它的作用主要可以使实现类集合使用迭代器去遍历自己的元素。

        方法:

    方法名 参数 返回值 描述
    Iterator Iterator<T> 返回一个内部元素为 T 的迭代器
                                         forEach                                           Consumer接口                                           void         

    Iterable 接口中的默认方法,其中可以传入一个Consumer的接口,可以去遍历内部的每一个元素,并且可以自定义方法,对每一个元素进行操作

    spliterator Spliterator<T> Iterable 接口中的默认方法,创建并返回一个分割迭代器
     1 public interface Iterable<T> {
     2     /**
     3      * 获取一个内部为 T 的迭代器
     4      *
     5      * @return 返回一个迭代器.
     6      */
     7     Iterator<T> iterator();
     8 
     9     /**
    10      * 被 default 关键字修饰,表示该方法为本接口的默认方法,迭代一个    
    11      * 集合并传入一个方法实现来对集合的每一个元素进行操作。
    12      */
    13     default void forEach(Consumer<? super T> action) {
    14         Objects.requireNonNull(action);// 判空操作,如果 action 为 null 则返回,NullPointerExcation();
    15         for (T t : this) {
    16             action.accept(t);
    17         }
    18     }
    19 
    20     /**
    21      * 此方法也是该接口的默认方法,获取一个可分割迭代器。
    22      */
    23     default Spliterator<T> spliterator() {
    24         return Spliterators.spliteratorUnknownSize(iterator(), 0);
    25     }
    26 }

      ②. Collection 接口

        用途:Collection接口是高度抽象出来的集合类接口,其中包含了大多数集合所需要的共同的方法,如增、删、改、查等。

        方法:

    方法名 参数 返回值 描述
    size int 获取一个集合的元素个数
    isEmpty boolean 判断该集合是否为空集合
    contains Object o boolean 判断该集合是否包含 o 元素
    iterator Iterator<E> 返回一个内部元素为 E 的迭代器
    toArray Object[] 将该集合转换为数组
                                    toArray                                                       T[] a                                                                     T[]                                                             将集合中的元素转换到指定的数组中,如果指定数组为空,则将集合中的元素放入一个全新的数组中,如果不为空则返回传入的数组,并且传入数组的长度为集合元素的个数
    add E e boolean 将元素e加入到集合中
    remove Object o boolean 将 o 元素从集合中移除
    containsAll Collection<?> c boolean 判断集合 c 是否被该集合包含
    addAll Collection<? extends E> c boolean 将集合 c 中的元素都添加到该集合中
    removeAll Collection<? extends E> c boolean 将该集合中所有 c 集合中出现的元素移除
    removeIf Predicate<? super E> filter boolean Collection 接口中的默认方法,可以按照一定的规则去删除集合中的元素
    retainAll Collection<?> c boolean 保留该集合中在 c 集合中存在的元素,其他元素进行移除
    clear void 清空集合
    equals Object o boolean 用 o 与该集合进行比较
    hashCode int 获取该集合的hashCode值
    spliterator Spliterator<T> Collection 接口中的默认方法,创建并返回一个分割迭代器
    stream Stream<E>

    Collection 接口中的默认方法,将该集合转换成Stream串行流

    parallelStream   Stream<E>  Collection 接口中的默认方法,将该集合转换成Stream并行流
      1 public interface Collection<E> extends Iterable<E> {
      2     // Query Operations
      3 
      4     /**
      5      * 获取一个集合的元素个数
      6      */
      7     int size();
      8 
      9     /**
     10      * 判断该集合是否为空集合
     11      */
     12     boolean isEmpty();
     13 
     14     /**
     15      * 判断该集合是否包含 o 元素
     16      */
     17     boolean contains(Object o);
     18 
     19     /**
     20      * 返回一个内部元素为 E 的迭代器
     21      */
     22     Iterator<E> iterator();
     23 
     24     /**
     25      * 将该集合转换为数组
     26      */
     27     Object[] toArray();
     28 
     29     /**
     30      *  将集合中的元素转换到指定的数组中,如果指定数组为空,则将集合中的元素放入一个全新的数组中,如果不为空则返回传入的数组,并且传入数组的长度为集合元素的个数
     31      */
     32     <T> T[] toArray(T[] a);
     33 
     34     /**
     35      * 将元素e加入到集合中
     36      */
     37     boolean add(E e);
     38 
     39     /**
     40      * 将 o 元素从集合中移除
     41      */
     42     boolean remove(Object o);
     43 
     44 
     45     /**
     46      * 判断集合 c 是否被该集合包含
     47      */
     48     boolean containsAll(Collection<?> c);
     49 
     50     /**
     51      * 将集合 c 中的元素都添加到该集合中
     52      */
     53     boolean addAll(Collection<? extends E> c);
     54 
     55     /**
     56      * 将该集合中所有 c 集合中出现的元素移除
     57      */
     58     boolean removeAll(Collection<?> c);
     59 
     60     /**
     61      * Collection 接口中的默认方法,可以按照一定的规则去删除集合中的元素
     62      */
     63     default boolean removeIf(Predicate<? super E> filter) {
     64         Objects.requireNonNull(filter);
     65         boolean removed = false;
     66         final Iterator<E> each = iterator();
     67         while (each.hasNext()) {
     68             if (filter.test(each.next())) {
     69                 each.remove();
     70                 removed = true;
     71             }
     72         }
     73         return removed;
     74     }
     75 
     76     /**
     77      * 保留该集合中在 c 集合中存在的元素,其他元素进行移除
     78      */
     79     boolean retainAll(Collection<?> c);
     80 
     81     /**
     82      * 清空集合
     83      */
     84     void clear();
     85 
     86     /**
     87      * 用 o 与该集合进行比较
     88      */
     89     boolean equals(Object o);
     90 
     91     /**
     92      * 获取该集合的hashCode值
     93      */
     94     int hashCode();
     95 
     96     /**
     97      * Collection 接口中的默认方法,创建并返回一个分割迭代器
     98      */
     99     @Override
    100     default Spliterator<E> spliterator() {
    101         return Spliterators.spliterator(this, 0);
    102     }
    103 
    104     /**
    105      * Collection 接口中的默认方法,将该集合转换成Stream串行流
    106      */
    107     default Stream<E> stream() {
    108         return StreamSupport.stream(spliterator(), false);
    109     }
    110 
    111     /**
    112      * Collection 接口中的默认方法,将该集合转换成Stream并行流
    113      */
    114     default Stream<E> parallelStream() {
    115         return StreamSupport.stream(spliterator(), true);
    116     }
    117 }

      ③. List 接口

        用途:List 接口是 Conllection 接口的子接口,它可以定义一个可重复的线性集合,可以在不同的位置存放相同的元素。

        方法 :其中有许多方法与 Conllection接口的方法相同,就不在此一一列出

    方法名 参数 返回值 描述
    addAll int index, Collection<? extends E> c boolean 在指定位置index处添加集合元素c
    replaceAll UnaryOperator<E> operator void List 集合中的默认方法,对集合中的元素进行操作,将执行结果存入元素的位置
    sort Comparator<? super E> c void 按照给定的排序规则进行排序
    get int index E 返回列表中index位置的元素。
    set int index, E element E 将列表中 index 位置的元素替换为 element
    add int index, E element void 在列表 index 位置添加元素 element
    remove int index E 删除 index 位置的元素
    indexOf Object o int 返回 o 元素第一次出现的位置
    lastIndexOf Object o int 返回 o 元素最后一次出现的位置
    listIterator ListIterator<E> 返回一个 ListIterator 迭代器
    subList int fromIndex, int toIndex List<E> 返回集合从 fromIndex 的位置到 toIndex 位置的元素的集合
     1 public interface List<E> extends Collection<E> {
     2 
     3     /**
     4      * 在指定位置index处添加集合元素c
     5      */
     6     boolean addAll(int index, Collection<? extends E> c);
     7 
     8     /**
     9      * 对集合中的元素进行操作,将执行结果存入元素的位置
    10      */
    11     default void replaceAll(UnaryOperator<E> operator) {
    12         Objects.requireNonNull(operator);
    13         final ListIterator<E> li = this.listIterator();
    14         while (li.hasNext()) {
    15             li.set(operator.apply(li.next()));
    16         }
    17     }
    18 
    19     /**
    20      * 按照给定的排序规则进行排序
    21      */
    22     @SuppressWarnings({"unchecked", "rawtypes"})
    23     default void sort(Comparator<? super E> c) {
    24         Object[] a = this.toArray(); //首先将集合转为数组
    25         Arrays.sort(a, (Comparator) c); //使用数组排序的sort方法进行排序
    26         ListIterator<E> i = this.listIterator();
    27         for (Object e : a) { //再将该集合的每个位置进行替换
    28             i.next();
    29             i.set((E) e);
    30         }
    31     }
    32 
    33     /**
    34      * 返回列表中 index 位置的元素。
    35      */
    36     E get(int index);
    37 
    38     /**
    39      * 将列表中 index 位置的元素替换为 element
    40      */
    41     E set(int index, E element);
    42 
    43     /**
    44      * 在列表 index 位置添加元素 element
    45      */
    46     void add(int index, E element);
    47 
    48     /**
    49      * 删除 index 位置的元素
    50      */
    51     E remove(int index);
    52 
    53     /**
    54      * 返回 o 元素第一次出现的位置
    55      */
    56     int indexOf(Object o);
    57 
    58     /**
    59      * 返回 o 元素最后一次出现的位置
    60      */
    61     int lastIndexOf(Object o);
    62 
    63     /**
    64      * 返回一个 ListIterator 迭代器
    65      */
    66     ListIterator<E> listIterator();
    67 
    68     /**
    69      * 返回一个 从 index 开始的 ListIterator 迭代器
    70      */
    71     ListIterator<E> listIterator(int index);
    72 
    73     // View
    74 
    75     /**
    76      * 返回集合从 fromIndex 的位置到 toIndex 位置的元素的集合
    77      */
    78     List<E> subList(int fromIndex, int toIndex);
    79 
    80 }

       ④. AbstractCollection 抽象类

        用途:这个类是个抽象类,直接实现了Collection接口的方法,其中为 list 和  set 直接或者间接提供了方法实现。

        方法:

    方法名 参数 返回值 描述
    size int 抽象方法,由子类实现
    iterator Iterator<E> 上层的获取迭代器的方法,在这里没有实现,由子类实现
    isEmpty boolean  判断集合是否为空
    contains Object o boolean  判断 o 对象是否被该集合包含
    toArray Object[] 将集合转换为数组
    toArray T[] a T[] 将集合转换到传入的数组中
    add E e boolean  此类中的add方法,子类必须重写自己的方法,此类不支持单个添加元素
    remove Object o boolean  删除 o 元素
    containsAll Collection<?> c boolean  判断 c 集合中的元素是否都被该集合包含
    addAll Collection<? extends E> c boolean  新增所有元素
    removeAll Collection<?> c boolean  删除传入集合的每一个元素
    retainAll Collection<?> c boolean  删除除传入集合元素以外的元素
    clear void   清空集合
      1 public abstract class MyAbstractCollection<E> implements Collection<E>{
      2     
      3     //指定集合的最大长度为 Integer.MAX_VALUE - 8
      4     private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
      5     
      6     /**
      7      * 无参构造器
      8      */
      9     public MyAbstractCollection() {}
     10 
     11     /**
     12      * 上层的size方法,在这里没有实现。
     13      */
     14     @Override
     15     public abstract int size();
     16     
     17     /**
     18      * 上层的获取迭代器的方法,在这里没有实现
     19      */
     20     @Override
     21     public abstract Iterator<E> iterator();
     22 
     23     /**
     24      * 判断集合是否为空
     25      */
     26     @Override
     27     public boolean isEmpty() {
     28         return size() == 0;
     29     }
     30 
     31     /**
     32      * 判断 o 对象是否被该集合包含
     33      */
     34     @Override
     35     public boolean contains(Object o) {
     36         Iterator<E> it = iterator(); //获取迭代器
     37         if (o == null) { //如果 o == null 判断集合中是否有 null 元素
     38             while (it.hasNext()) { 
     39                 if (it.next() == null) {
     40                     return true;
     41                 }
     42             }
     43         } else {
     44             while (it.hasNext()) {
     45                 if (it.next().equals(o)) {
     46                     return true;
     47                 }
     48             }
     49         }
     50         return false;
     51     }
     52 
     53     /**
     54      * 将集合转换为数组
     55      */
     56     @Override
     57     public Object[] toArray() {
     58         Object [] r = new Object[size()];
     59         Iterator<E> it = iterator();
     60         for (int i = 0; i < r.length; i++) {
     61             //如果发现迭代器中的值小于 r的长度 则进行缩容
     62             if (!it.hasNext()) {
     63                 return Arrays.copyOf(r, i);
     64             }
     65             r[i] = it.next();
     66         }
     67         //如果发现迭代器中的值大于 r的长度  则进行扩容
     68         return it.hasNext() ? finishToArray(r, it) : r;
     69     }
     70     
     71     /**
     72      * 数组扩容
     73      * @param r 
     74      * @param it
     75      * @return
     76      */
     77     private static <T> T[] finishToArray(T[] r, Iterator<?> it) {
     78         int i = r.length;
     79         while(it.hasNext()) {
     80             int newLeng = r.length; 
     81             //当新长度与原长度相同时进行扩容
     82             if (i == newLeng) {
     83                 //扩容原长度的一半+1
     84                 int cap = newLeng + (newLeng >> 1) + 1;
     85                 //此处要判断cap的值是否大于Integer的最大值
     86                 if (cap - MAX_ARRAY_SIZE > 0) {
     87                     cap = hugeCapacity(cap + 1);
     88                 }
     89                 r = Arrays.copyOf(r, cap);
     90             }
     91             r[i ++] = (T) it.next();
     92         }
     93         //最后判断r的实际长度与 i 是否相等, 如果不等就将后面多余的位置删除
     94         return (r.length == i) ? r : Arrays.copyOf(r, i);
     95     }
     96 
     97     /**
     98      * 如果数组长度超出最大长度的处理
     99      * @param minCapacity
    100      * @return
    101      */
    102     private static int hugeCapacity(int minCapacity) {
    103         if (minCapacity < 0) {
    104             throw new OutOfMemoryError("数组长度过长");
    105         }
    106         return minCapacity > MAX_ARRAY_SIZE ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
    107     }
    108     
    109     /**
    110      * 将集合转换到传入的数组中
    111      */
    112     @Override
    113     @SuppressWarnings("unchecked")
    114     public <T> T[] toArray(T[] a) {
    115         int size = size();
    116         //如果 a的长度大于或者等于 集合的长度则 r就等于a数组,否则就新建一个数组
    117         T[] r = a.length >= size() ? a : (T[]) Array.newInstance(
    118                 a.getClass().getComponentType(), size);
    119         Iterator<E> it = iterator();
    120         
    121         for (int i = 0; i < r.length; i++) {
    122             if (!it.hasNext()) {
    123                 if (a == r) {//如果是r与传入的数组是同一个数组 则将后面的位置 置为 null
    124                     r[i] = null;
    125                 } else if (a.length < i) { //如果传入的数组长度小于r的长度 则缩容到i的长度
    126                     return Arrays.copyOf(r, i);
    127                 } else {//如果传入的数组长度大于或等于r的长度  则将后面的位置都置为null
    128                     System.arraycopy(r, 0, a, 0, i);
    129                     if (a.length > i) {
    130                         a[i] = null;
    131                     }
    132                 }
    133                 return a;
    134             }
    135             r[i] = (T) it.next();
    136         }
    137         return it.hasNext() ? finishToArray(r, it) : r;
    138     }
    139 
    140     /**
    141      * 此类中的add方法,子类必须重写自己的方法,此类不支持单个添加元素
    142      */
    143     @Override
    144     public boolean add(E e) {
    145         throw new UnsupportedOperationException();
    146     }
    147 
    148     /**
    149      * 删除 o 元素
    150      */
    151     @Override
    152     public boolean remove(Object o) {
    153         Iterator<E> it = iterator();
    154         if (o == null) { 
    155             while (it.hasNext()) { //如果 o 为 null 则将第一个 null元素删除
    156                 if (it.next() == null) {
    157                     it.remove();
    158                     return false;
    159                 }
    160             }
    161         } else {
    162             while (it.hasNext()) { //如果 找到第一个 与o元素相同的值 删除
    163                 if (o.equals(it.next())) {
    164                     it.remove();
    165                     return false;
    166                 }
    167             }
    168         }
    169         return false;
    170     }
    171 
    172     /**
    173      * 判断 c 集合中的元素是否都被该集合包含
    174      */
    175     @Override
    176     public boolean containsAll(Collection<?> c) {
    177         //判断 c 中每一个元素是否存在
    178         for (Object o : c) { 
    179             if (!contains(o)) {
    180                 return false;
    181             }
    182         }
    183         return true;
    184     }
    185     
    186     /**
    187      * 新增所有元素
    188      */
    189     @Override
    190     public boolean addAll(Collection<? extends E> c) {
    191         boolean token = false;
    192         for (E o : c) { 
    193             if (add(o)) {
    194                 token = true;
    195             }
    196         }
    197         return token;
    198     }
    199 
    200     /**
    201      * 删除传入集合的每一个元素
    202      */
    203     @Override
    204     public boolean removeAll(Collection<?> c) {
    205         Objects.requireNonNull(c);
    206         boolean token = false;
    207         Iterator<E> it = iterator();
    208         //迭代集合本身,判断每一个元素是否存在于集合 c 中,如果存在则删除
    209         while (it.hasNext()) {
    210             if (c.contains(it.next())) {
    211                 it.remove();
    212                 token = true;
    213             }
    214         }
    215         return token;
    216     }
    217 
    218     /**
    219      * 删除除传入集合元素以外的元素
    220      */
    221     @Override
    222     public boolean retainAll(Collection<?> c) {
    223         Objects.requireNonNull(c);
    224         boolean token = false;
    225         Iterator<E> it = iterator();
    226         //迭代集合本身,判断每一个元素是否存在于集合 c 中,如果不存在则删除
    227         while (it.hasNext()) {
    228             if (!c.contains(it.next())) {
    229                 it.remove();
    230                 token = true;
    231             }
    232         }
    233         return token;
    234     }
    235 
    236     /**
    237      * 清空集合
    238      */
    239     @Override
    240     public void clear() {
    241         Iterator<E> it = iterator();
    242         //迭代集合删除每一个元素
    243         while (it.hasNext()) {
    244             it.next();
    245             it.remove();
    246         }
    247     }
    248 
    249 }

      ⑤. AbstractList 抽象类

        作用:此类继承 AbstractCollection 抽象类,继承 List 接口 ,为 ArrayList 的父类,提供了大部分集合操作的方法。此类中还存在几个内部类 分别是 ListItr,Itr,除了这两个内部类之外,SubList和RandomAccessSubList 这两个类也在 AbstractCollection 中。 ListItr 类 为list定义独有的迭代器,而 Itr 则为 ListItr 的父类。在ListItr 类中主要的一些方法都是去判断指针的位置,去描述指针是如何去移动,如何去删除元素,删除元素后对集合的改变,以及多个迭代器之间的互相的影响。SubList 类为集合提供了截取集合中某一段的方法,但是这个方法存在一些问题,他内部的方法是直接在传入集合上直接进行操作的,也就是说不仅仅会改变截取的部分集合,还会改变传入的集合,所以要谨慎使用。在下面方法中,内部类的方法就不提供了,但是会在后面的代码展示中简单解析一下代码的含义,以及操作的意义。

        方法:

    方法名  参数  返回值  描述
    add E e boolean 重新父类的add方法,返回boolean值
    add int index, E element void

    实现 List 接口中的add方法,如果直接调用这个方法会抛出异常
    所以在子类中一定要重写此方法

    get int index E List 接口中的get方法,在这里不做实现,由子类去实现
    set int index, E element E

    List 接口中的set方法,在这里只是抛出异常,子类如果直接调用,则会抛出异常,
    如果要使用则需要子类去重写这个set方法

    remove int index E

    List 接口中的remove方法,在这里只是抛出异常,子类如果直接调用,则会抛出异常,
    如果要使用则需要子类去重写这个remove方法

    addAll int index, Collection<? extends E> c boolean 重写 List 接口中的addAll方法
    indexOf Object o int List 接口中的方法, 获取第一个与 o 对象,相同的元素的位置,如果没有则返回 -1
    lastIndexOf Object o int List 接口中的方法, 获取最后一个与 o 对象,相同的元素的位置
    iterator  无 Iterator<E> 获取迭代器
    listIterator  无 ListIterator<E> 获取ListIterator迭代器
    listIterator int index ListIterator<E> 获取迭代器从index开始
    removeRange int fromIndex, int toIndex void 删除集合fromIndex到toIndex的元素
      1 public abstract class MyAbstractList<E> extends MyAbstractCollection<E> implements List<E>{
      2     
      3     /**
      4      * 构造函数由子类调用
      5      */
      6     protected MyAbstractList() {
      7     }
      8     
      9     /**
     10      * 重新父类的add方法,返回boolean值
     11      */
     12     @Override
     13     public boolean add(E e) {
     14         add(size(), e);
     15         return true;
     16     }
     17     
     18     /**
     19      * 实现 List 接口中的add方法,如果直接调用这个方法会抛出异常
     20      * 所以在子类中一定要重写此方法
     21      */
     22     @Override
     23     public void add(int index, E element) {
     24         throw new UnsupportedOperationException();
     25     }
     26     
     27     /**
     28      * List 接口中的get方法,在这里不做实现,由子类去实现
     29      */
     30     @Override
     31     public abstract E get(int index);
     32 
     33     /**
     34      * List 接口中的set方法,在这里只是抛出异常,子类如果直接调用,则会抛出异常,
     35      * 如果要使用则需要子类去重写这个set方法
     36      */
     37     @Override
     38     public E set(int index, E element) {
     39         throw new UnsupportedOperationException();
     40     }
     41     
     42     /**
     43      * List 接口中的remove方法,在这里只是抛出异常,子类如果直接调用,则会抛出异常,
     44      * 如果要使用则需要子类去重写这个remove方法
     45      */
     46     @Override
     47     public E remove(int index) {
     48         throw new UnsupportedOperationException();
     49     }
     50     
     51     /**
     52      * 此参数为修改的次数,他主要是和迭代器一起使用,来确保线程安全,
     53      * 保证线程之间的修改可见性。如果出现线程不安全的情况导致这个值与迭代器中的modCount值不同时则会抛出异常。
     54      * 在一个迭代器初始的时候会赋予它调用这个迭代器的对象的mCount,如何在迭代器遍历的过程中,
     55      * 一旦发现这个对象的mcount和迭代器中存储的mcount不一样那就抛异常 
     56      */
     57     protected transient int modCount = 0;
     58     
     59     /**
     60      * 重写 List 接口中的addAll方法
     61      */
     62     @Override
     63     public boolean addAll(int index, Collection<? extends E> c) {
     64         //判断数组是否越界,如果越界抛出下标越界异常
     65         rangeCheckForAdd(index);
     66         boolean token = false;
     67         for (E e : c) {
     68             add(index++, e);
     69             token = true;
     70         }
     71         return token;
     72     }
     73 
     74     /**
     75      * 判断传入的index是否在小于0 或者大于集合长度
     76      * @param index
     77      */
     78     private void rangeCheckForAdd(int index) {
     79         if (index < 0 || index > size())
     80             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
     81     }
     82     
     83     /**
     84      * 获取下标的位置,和实际集合长度
     85      * @param index
     86      * @return
     87      */
     88     private String outOfBoundsMsg(int index) {
     89         return "Index: "+index+", Size: "+size();
     90     }
     91     
     92     /**
     93      * List 接口中的方法, 获取第一个与 o 对象,相同的元素的位置,如果没有则返回 -1
     94      */
     95     @Override
     96     public int indexOf(Object o) {
     97         ListIterator<E> it = listIterator();
     98         if (o == null) {
     99             while(it.hasNext()) {
    100                 if (it.next() == null) {
    101                     //获取目前迭代器的位置
    102                     return it.previousIndex();
    103                 }
    104             }
    105         } else {
    106             while(it.hasNext()) {
    107                 if (it.next().equals(o)) {
    108                     //获取目前迭代器上一个元素的位置
    109                     return it.previousIndex();
    110                 }
    111             }
    112         }
    113         return -1;
    114     }
    115 
    116     /**
    117      * List 接口中的方法, 获取最后一个与 o 对象,相同的元素的位置
    118      */
    119     @Override
    120     public int lastIndexOf(Object o) {
    121         ListIterator<E> it = listIterator(size());
    122         if (o == null) {
    123             //获取迭代器是否存在的上一个元素,如果存在返回true
    124             while (it.hasPrevious()) {
    125                 //获取迭代器上一个元素,反向迭代
    126                 if (it.previous() == null) {
    127                     //返回迭代器下一个元素的位置
    128                     return it.nextIndex();
    129                 }
    130             }
    131         } else {
    132             while (it.hasPrevious()) {
    133                 //获取迭代器上一个元素,反向迭代
    134                 if (o.equals(it.previous())) {
    135                     //返回迭代器下一个元素的位置
    136                     return it.nextIndex();
    137                 }
    138             }
    139         }
    140         return -1;
    141     }
    142     
    143     /**
    144      * 获取迭代器
    145      */
    146     @Override
    147     public Iterator<E> iterator() {
    148         return new Itr();
    149     }
    150 
    151     /**
    152      * 获取ListIterator迭代器
    153      */
    154     @Override
    155     public ListIterator<E> listIterator() {
    156         return listIterator(0);
    157     }
    158 
    159     /**
    160      * 获取迭代器从index开始
    161      */
    162     @Override
    163     public ListIterator<E> listIterator(int index) {
    164         rangeCheckForAdd(index);
    165         return new ListItr(index);
    166     }
    167 
    168     /**
    169      * 删除集合fromIndex到toIndex的元素
    170      * @param fromIndex
    171      * @param toIndex
    172      */
    173     protected void removeRange(int fromIndex, int toIndex) {
    174        ListIterator<E> it = listIterator(fromIndex);
    175        for (int i = 0; i < toIndex - fromIndex; i++) {
    176            it.next();
    177            it.remove();
    178        }
    179     }
    180 
    181     private class Itr implements Iterator<E> {
    182         
    183         /**
    184          * 调用迭代器 next 方法返回的索引
    185          */
    186         int cursor = 0;
    187 
    188         /**
    189          * 上一次调用next 方法返回的索引
    190          */
    191         int lastRet = -1;
    192 
    193         /**
    194          * 此参数为迭代器中的结构修改的次数,初始化时会将集合中的 modCount 赋值给迭代器
    195          */
    196         int expectedModCount = modCount;
    197 
    198         /**
    199          * 判断是否存在下一个元素
    200          */
    201         @Override
    202         public boolean hasNext() {
    203             return cursor != size();
    204         }
    205 
    206         @Override
    207         public E next() {
    208             //确保其他线程没有操作此集合
    209             checkForComodification();
    210             try {
    211                 //获取下一次next的元素的下标
    212                 int i = cursor;
    213                 //获取该下标的元素
    214                 E e = get(i);
    215                 //将此下标赋值给lastRet
    216                 lastRet = cursor;
    217                 //获取下一次next的元素下标
    218                 cursor ++;
    219                 return e;
    220             } catch (Exception e) {
    221                 checkForComodification();
    222                 throw new NoSuchElementException();
    223             }
    224         }
    225         
    226         /**
    227          * 此处还重写了Iterator接口的remove方法
    228          */
    229         @Override
    230         public void remove() {
    231             //如果lastRet的值小于0则说明迭代器指针还处于集合最前面,则没有删除的元素,所以抛出异常
    232             if(lastRet < 0) {
    233                 throw new IllegalStateException();
    234             }
    235             //确保其他线程没有操作此集合
    236             checkForComodification();
    237             try {
    238                 //删除上一个元素
    239                 MyAbstractList.this.remove(lastRet);
    240                 if (lastRet < cursor) {
    241                     cursor --;
    242                 }
    243                 //删除只会删除next跳过的那个元素,删除一次之后将上一个下标置为-1,保证不能多次删除
    244                 lastRet = -1;
    245                 expectedModCount = modCount;
    246             } catch (Exception e) {
    247                 throw new ConcurrentModificationException();
    248             }
    249         }
    250 
    251         /**
    252          * 使用此方法去保证线程之间的操作可见性,如果迭代器的操作次数与集合的操作次数不一致,则会抛出异常
    253          */
    254         final void checkForComodification() {
    255             if (modCount != expectedModCount)
    256                 throw new ConcurrentModificationException();
    257         }
    258     }
    259     
    260     private class ListItr extends Itr implements ListIterator<E> {
    261 
    262         ListItr(int index) {
    263             cursor = index;
    264         }
    265         
    266         /**
    267          * 判断上一个元素是否存在
    268          */
    269         @Override
    270         public boolean hasPrevious() {
    271             //如果cursor为0则表示指针在集合头部,则上一个元素不存在
    272             return cursor != 0;
    273         }
    274         
    275         /**
    276          * 获取上一个元素
    277          */
    278         @Override
    279         public E previous() {
    280             //判断是否被其他线程修改集合结构
    281             checkForComodification();
    282             try {
    283                 //获取上一个元素的下标
    284                 int i = cursor - 1;
    285                 //获取上一个元素
    286                 E e = get(i);
    287                 cursor = i;
    288                 lastRet = i;
    289                 return e;
    290             } catch (Exception e) {
    291                 checkForComodification();
    292                 throw new NoSuchElementException();
    293             }
    294         }
    295 
    296         /**
    297          * 获取下一个元素的下标
    298          */
    299         @Override
    300         public int nextIndex() {
    301             return cursor;
    302         }
    303 
    304         /**
    305          * 获取上一个元素的下标
    306          */
    307         @Override
    308         public int previousIndex() {
    309             return cursor - 1;
    310         }
    311 
    312         /**
    313          * 修改元素
    314          */
    315         @Override
    316         public void set(E e) {
    317             //修改元素修改的为上一次跳过的元素,如果上一次的元素是-1则说明还在集合头部,
    318             //无元素可以修改,所以抛出异常
    319             if (lastRet < 0) {
    320                 throw new IllegalStateException();
    321             }
    322             checkForComodification();
    323             try {
    324                 //使用MyAbstractList类的set方法
    325                 MyAbstractList.this.set(lastRet, e);
    326                 //将修改的次数赋值给迭代器
    327                 expectedModCount = modCount;
    328             } catch (Exception e2) {
    329                 throw new ConcurrentModificationException();
    330             }
    331         }
    332 
    333         /**
    334          * 新增元素
    335          */
    336         @Override
    337         public void add(E e) {
    338             checkForComodification();
    339             try {
    340                 //获取集合下一个元素的位置
    341                 int i = cursor;
    342                 //将元素新增到下一个位置
    343                 MyAbstractList.this.add(i, e);
    344                 lastRet = -1;
    345                 cursor++;
    346                 expectedModCount = modCount;
    347             } catch (Exception e2) {
    348                 throw new ConcurrentModificationException();
    349             }
    350         }
    351         
    352     }
    353 }
    354 
    355 class SubList<E> extends MyAbstractList<E> {
    356 
    357     //原始的集合
    358     private final MyAbstractList<E> l;
    359     //开始截取集合的起始位置
    360     private final int offset;
    361     //截取集合的长度
    362     private int size;
    363     
    364     SubList(MyAbstractList<E> list, int fromIndex, int toIndex){
    365         //如果起始位置小于0 则抛出异常
    366         if (fromIndex < 0) {
    367             throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
    368         }
    369         //如果结束位置大于数组长度 则抛出异常
    370         if (toIndex > list.size()) {
    371             throw new IndexOutOfBoundsException("toIndex = " + toIndex);
    372         }
    373         //如果起始位置大于结束位置 则抛出异常
    374         if (fromIndex > toIndex) {
    375             throw new IllegalArgumentException("fromIndex(" + fromIndex +
    376                     ") > toIndex(" + toIndex + ")");
    377         }
    378         l = list;
    379         offset = fromIndex;
    380         size = toIndex - fromIndex;
    381         this.modCount = l.modCount;
    382     }
    383     
    384     /**
    385      * 获取index的元素
    386      */
    387     @Override
    388     public E get(int index) {
    389         //判断集合下标是否不在集合范围内
    390         rangeCheck(index);
    391         checkForComodification();
    392         //这里为什么要加offset呢,因为此处的l为原始的list 
    393         //而offset 为截取后的开始位置,然后加上现在要获取的元素的下标位置,
    394         //才是现在要获取的元素
    395         return l.get(index + offset);
    396     }
    397     
    398     /**
    399      * 修改index位置的元素
    400      */
    401     @Override
    402     public E set(int index, E element) {
    403         rangeCheck(index);
    404         checkForComodification();
    405         return l.set(index+offset, element);
    406     }
    407     
    408     /**
    409      * 判断集合结构是否被其他线程改变
    410      */
    411     private void checkForComodification() {
    412         if (this.modCount != l.modCount)
    413             throw new ConcurrentModificationException();
    414     }
    415     
    416     /**
    417      * 判断集合下标是否不在集合范围内
    418      * @param index
    419      */
    420     private void rangeCheck(int index) {
    421         if (index < 0 || index >= size)
    422             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    423     }
    424     
    425     /**
    426      * 输出集合下标和长度
    427      * @param index
    428      * @return
    429      */
    430     private String outOfBoundsMsg(int index) {
    431         return "Index: " + index + ", Size: " + size;
    432     }
    433 
    434     /**
    435      * 获取截取后集合的长度
    436      */
    437     @Override
    438     public int size() {
    439         checkForComodification();
    440         return size;
    441     }
    442     
    443     /**
    444      * 在指定位置添加元素
    445      */
    446     @Override
    447     public void add(int index, E element) {
    448         rangeCheck(index);
    449         checkForComodification();
    450         l.add(index + offset, element);
    451         this.modCount = l.modCount;
    452         size++;
    453     }
    454     
    455     /**
    456      * 删除指定位置元素
    457      */
    458     @Override
    459     public E remove(int index) {
    460         rangeCheck(index);
    461         checkForComodification();
    462         E e = l.remove(index + offset);
    463         this.modCount = l.modCount;
    464         size--;
    465         return e;
    466     }
    467     
    468     /**
    469      * 删除指定区域的元素
    470      */
    471     @Override
    472     protected void removeRange(int fromIndex, int toIndex) {
    473         checkForComodification();
    474         l.removeRange(fromIndex + offset, toIndex + offset);
    475         this.modCount = l.modCount;
    476         size -= (toIndex - fromIndex);
    477     }
    478     
    479     /**
    480      * 添加c到集合中,从size开始
    481      */
    482     @Override
    483     public boolean addAll(Collection<? extends E> c) {
    484         return addAll(size, c);
    485     }
    486     
    487     /**
    488      * 添加c到集合中,从index开始
    489      */
    490     @Override
    491     public boolean addAll(int index, Collection<? extends E> c) {
    492         rangeCheck(index);
    493         int cSize = c.size();
    494         if (c.size() == 0) {
    495             return false;
    496         }
    497         checkForComodification();
    498         l.addAll(index + offset, c);
    499         size += cSize;
    500         return true;
    501     }
    502     
    503     /**
    504      * 获取迭代器
    505      */
    506     public Iterator<E> iterator() {
    507         return listIterator();
    508     }
    509     
    510     /**
    511      * 获取ListIterator
    512      */
    513     public ListIterator<E> listIterator(final int index) {
    514         checkForComodification();
    515         rangeCheckForAdd(index);
    516         return new ListIterator<E>() {
    517 
    518             private final ListIterator<E> i = l.listIterator(index+offset);
    519 
    520             public boolean hasNext() {
    521                 return nextIndex() < size;
    522             }
    523 
    524             public E next() {
    525                 if (hasNext())
    526                     return i.next();
    527                 else
    528                     throw new NoSuchElementException();
    529             }
    530 
    531             public boolean hasPrevious() {
    532                 return previousIndex() >= 0;
    533             }
    534 
    535             public E previous() {
    536                 if (hasPrevious())
    537                     return i.previous();
    538                 else
    539                     throw new NoSuchElementException();
    540             }
    541 
    542             public int nextIndex() {
    543                 return i.nextIndex() - offset;
    544             }
    545 
    546             public int previousIndex() {
    547                 return i.previousIndex() - offset;
    548             }
    549 
    550             public void remove() {
    551                 i.remove();
    552                 SubList.this.modCount = l.modCount;
    553                 size--;
    554             }
    555 
    556             public void set(E e) {
    557                 i.set(e);
    558             }
    559 
    560             public void add(E e) {
    561                 i.add(e);
    562                 SubList.this.modCount = l.modCount;
    563                 size++;
    564             }
    565         };
    566     }
    567     
    568      private void rangeCheckForAdd(int index) {
    569          if (index < 0 || index > size)
    570             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    571      }
    572      
    573      /**
    574       * 截取集合
    575       */
    576      @Override
    577      public List<E> subList(int fromIndex, int toIndex) {
    578             return new SubList<>(this, fromIndex, toIndex);
    579         }
    580 }
    581 
    582 class RandomAccessSubList<E> extends SubList<E> implements RandomAccess {
    583     RandomAccessSubList(MyAbstractList<E> list, int fromIndex, int toIndex) {
    584         super(list, fromIndex, toIndex);
    585     }
    586 
    587     public List<E> subList(int fromIndex, int toIndex) {
    588         return new RandomAccessSubList<>(this, fromIndex, toIndex);
    589     }
    590 }

      ⑥. ArrayList  

        作用:ArrayList,是我们在开发过程中最常使用到的线性表的结构,它的内部可以存放重复的元素,并且可以存放null元素,属于线程不安全的集合类,查询效率高。

        方法:在java8中在arrayList中加入了一些方法,还加入了获取流的类,在这里我只列出A让rayList中的方法,其他一些内部类就不一一列出,但是在下面源码解读中,我会将每个方法自己的注释以注解的方式进行注释。

    方法名 入参 出参 描述
    trimToSize void 去除集合中预留元素的位置
    ensureCapacity int minCapacity void 数组扩容
    size int 获取集合长度
    isEmpty boolean 判断集合是否为空
    contains Object o boolean 判断集合是否包含 o
    indexOf Object o int 获取o第一次出现的下标
    lastIndexOf Object o int 获取o最后一次出现在集合的位置
    clone Object 克隆集合
    toArray Object[] 将集合转数组
    toArray T[] a T[] 将集合转为传入的数组
    elementData int index E 获取第 index个元素
    get int index E 获取第index个元素
    rangeCheck int index void 判断传入的下标是否比数组长度大
    outOfBoundsMsg int index String 获取传入的index的长度和数组长度
    set int index, E element E 修改index元素,将新的element放入集合index的位置,并返回oldelement
    add E e boolean 新增元素
    add int index, E element void 在指定位置插入元素
    rangeCheckForAdd int index void 判断index是否在集合长度范围内
    remove int index E 删除index的元素 ,并返回
    remove Object o boolean 删除第一个元素 o
    fastRemove int index void 删除 index 位置的元素
    clear void 清空集合
    addAll Collection<? extends E> c boolean 将c集合添加到本集合
    addAll int index, Collection<? extends E> c boolean 在index处,添加集合c
    removeRange int fromIndex, int toIndex void 删除fromIndex到toIndex的元素
    removeAll Collection<?> c boolean 删除集合中包含c集合中的元素
    writeObject java.io.ObjectOutputStream s void 用于MyArrayList序列化使用
    readObject java.io.ObjectInputStream s void 反序列化方法
    listIterator int index ListIterator<E> 获取从 index 开始的List迭代器
    listIterator ListIterator<E> 获取从 0 开始的List迭代器
    iterator Iterator<E> 获取迭代器
    subList int fromIndex, int toIndex List<E> 截取集合 从fromIndex 到 toIndex
    forEach Consumer<? super E> action void 遍历集合,其中每个元素执行action中的方法
    spliterator Spliterator<E> 获取Spliterator迭代器 java8提供
    removeIf Predicate<? super E> filter boolean 如果集合中元素在一定条件内就删除,条件由开发者传入
    replaceAll UnaryOperator<E> operator void 按照一定的规则对集合进行操作,规则由开发者传入
    sort Comparator<? super E> c void java8中新加入的方法,按照一定的规则进行排序
       1 public class MyArrayList<E> extends AbstractList<E>
       2 implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
       3 
       4     private static final long serialVersionUID = 2572016039206533046L;
       5 
       6     /**
       7      * 创建集合时的初始 长度
       8      */
       9     private static final int DEFAULT_CAPACITY = 10;
      10 
      11     /**
      12      * 当创建集合时传入的长度为0时默认使用下面的数组
      13      */
      14     private static final Object[] EMPTY_ELEMENTDATA = {};
      15 
      16     /**
      17      * 当创建集合时不传入参数时默认使用下面的数组
      18      */
      19     private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
      20     
      21     /**
      22      * 集合最大长度
      23      */
      24     private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
      25 
      26     /**
      27      * 这个为集合默认使用的数组,使用 transient 修饰,将并不会被序列化到指定位置
      28      */
      29     transient Object[] elementData; 
      30 
      31     /**
      32      * elementData 数组长度
      33      */
      34     private int size;
      35     
      36     /**
      37      * 记录数组结构变化次数,保证多线程对数组结构改变时线程安全
      38      */
      39     protected transient int modCount = 0;
      40     
      41     /**
      42      * 无参构造器
      43      */
      44     public MyArrayList() {
      45         //直接使用默认的数组
      46         this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
      47     }
      48     
      49     /**
      50      * 第一个有参构造器,传入集合长度
      51      * @param initialCapacity 创建集合的长度
      52      */
      53     public MyArrayList(int initialCapacity) {
      54         if (initialCapacity > 0) { 
      55             //如果长度大于 0 则创建对应长度的数组,并且赋值给elementData
      56             this.elementData = new Object[initialCapacity];
      57         } else if (initialCapacity == 0) {
      58             //如果长度等于 0 则直接使用默认数组 EMPTY_ELEMENTDATA
      59             this.elementData = EMPTY_ELEMENTDATA;
      60         } else {
      61             //如果小于 0 则抛出异常
      62             throw new IllegalArgumentException("Illegal Capacity: "+
      63                     initialCapacity);
      64         }
      65         
      66     }
      67 
      68     /**
      69      * 第二个有参构造器,传入一个集合
      70      * @param c 
      71      */
      72     public MyArrayList(Collection<? extends E> c) {
      73         //将 传入的集合转为数组
      74         elementData = c.toArray();
      75         //获取集合长度
      76         size = elementData.length;
      77         if (size != 0) {
      78             //如果传入的集合转数组之后不是Object的数组,则copy 到Object 数组中
      79             if (elementData.getClass() != Object[].class) {
      80                 elementData = Arrays.copyOf(elementData, size, Object[].class);    
      81             }
      82         } else {
      83             //如果传入的集合长度为 0 则使用默认的数组 EMPTY_ELEMENTDATA
      84             elementData = EMPTY_ELEMENTDATA;
      85         }
      86     }
      87     
      88     /**
      89      * 去除集合中预留元素的位置
      90      */
      91     public void trimToSize() {
      92         modCount ++;
      93         if (size < elementData.length) {
      94             //如果size与数组长度不相等,则判断size是否为0 如果为0 则使用默认数组
      95             //如果size不为0则将elementDta中size长度之后的预留元素的位置删除
      96             elementData = (size == 0) ?
      97                     EMPTY_ELEMENTDATA :
      98                         Arrays.copyOf(elementData, size);
      99         }
     100     }
     101     
     102     /**
     103      * 数组扩容
     104      * @param minCapacity 扩容的长度
     105      */
     106     public void ensureCapacity(int minCapacity) {
     107         //判断elementData 是否为默认的数组,如果是最小长度为 0 否则 最小长度为默认的10
     108         int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
     109                 ? 0 : DEFAULT_CAPACITY;
     110         //判断扩容的长度是否比最小长度大,如果大继续扩容,否则不扩容
     111         if (minCapacity > minExpand) {
     112             ensureExplicitCapacity(minCapacity);
     113         }
     114     }
     115     
     116     private void ensureCapacityInternal(int minCapacity) {
     117         /**
     118          * 判断elementData 是否为默认数组,如果是则 minCapacity 与
     119          * 默认长度做比较,取较大的那个数扩容
     120          */
     121         if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
     122             minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
     123         }
     124         //否则按照传入值进行扩容
     125         ensureExplicitCapacity(minCapacity);
     126     }
     127 
     128     private void ensureExplicitCapacity(int minCapacity) {
     129         modCount++;
     130 
     131         // 传入值与现在数组长度做比较,如果传入值大于目前数组长度继续扩容
     132         if (minCapacity - elementData.length > 0)
     133             grow(minCapacity);
     134     }
     135 
     136     private void grow(int minCapacity) {
     137         // 获取数组原长度
     138         int oldCapacity = elementData.length;
     139         // 数组新长度为原长度+原长度的一半
     140         int newCapacity = oldCapacity + (oldCapacity >> 1);
     141         //如果新长度小于传入的minCapacity 则新长度 = minCapacity
     142         if (newCapacity - minCapacity < 0)
     143             newCapacity = minCapacity;
     144         //如果新长度大于集合最大长度则执行hugeCapacity 获取扩容的长度
     145         if (newCapacity - MAX_ARRAY_SIZE > 0)
     146             newCapacity = hugeCapacity(minCapacity);
     147         // 进行扩容
     148         elementData = Arrays.copyOf(elementData, newCapacity);
     149     }
     150     
     151     private static int hugeCapacity(int minCapacity) {
     152         if (minCapacity < 0) // overflow
     153             throw new OutOfMemoryError();
     154         //如果新长度大于集合最大长度则返回 int的最大值,否则返回集合最大值
     155         return (minCapacity > MAX_ARRAY_SIZE) ?
     156             Integer.MAX_VALUE :
     157             MAX_ARRAY_SIZE;
     158     }
     159     
     160     /**
     161      * 获取集合长度
     162      */
     163     @Override
     164     public int size() {
     165         return size;
     166     }
     167     
     168     /**
     169      * 判断集合是否为空
     170      */
     171     @Override
     172     public boolean isEmpty() {
     173         return size == 0;
     174     }
     175     
     176     /**
     177      * 判断集合是否包含 o
     178      */
     179     @Override
     180     public boolean contains(Object o) {
     181         //如果集合中可以获取到o的下标,则说明o存在于集合中
     182         return indexOf(o) >= 0;
     183     }
     184     
     185     /**
     186      * 获取o第一次出现的下标
     187      */
     188     @Override
     189     public int indexOf(Object o) {
     190         if (o == null) {
     191             for (int i = 0; i < size; i++)
     192                 if (elementData[i]==null)
     193                     return i;
     194         } else {
     195             for (int i = 0; i < size; i++)
     196                 if (o.equals(elementData[i]))
     197                     return i;
     198         }
     199         return -1;
     200     }
     201     
     202     /**
     203      * 获取o最后一次出现在集合的位置
     204      */
     205     @Override
     206     public int lastIndexOf(Object o) {
     207         if (o == null) {
     208             for (int i = size-1; i >= 0; i--)
     209                 if (elementData[i]==null)
     210                     return i;
     211         } else {
     212             for (int i = size-1; i >= 0; i--)
     213                 if (o.equals(elementData[i]))
     214                     return i;
     215         }
     216         return -1;
     217     }
     218     
     219     /**
     220      * 克隆集合
     221      */
     222     @Override
     223     public Object clone() {
     224         try {
     225             MyArrayList<?> v = (MyArrayList<?>) super.clone();
     226             //copy原集合,并将结构改变次数置为0
     227             v.elementData = Arrays.copyOf(elementData, size);
     228             v.modCount = 0;
     229             return v;
     230         } catch (CloneNotSupportedException e) {
     231             throw new InternalError(e);
     232         }
     233     }
     234     
     235     /**
     236      * 将集合转数组
     237      */
     238     @Override
     239     public Object[] toArray() {
     240         return Arrays.copyOf(elementData, size);
     241     }
     242     
     243     /**
     244      * 将集合转为传入的数组
     245      */
     246     @Override
     247     public <T> T[] toArray(T[] a) {
     248         if (a.length < size)
     249             // 如果传入的数组长度小于集合的长度,则需要先扩容再copy
     250             return (T[]) Arrays.copyOf(elementData, size, a.getClass());
     251         System.arraycopy(elementData, 0, a, 0, size);
     252         if (a.length > size)
     253             a[size] = null;
     254         return a;
     255     }
     256     
     257     /**
     258      * 获取第 index个元素
     259      * @param index
     260      * @return
     261      */
     262     E elementData(int index) {
     263         return (E) elementData[index];
     264     }
     265     
     266     /**
     267      * 获取第index个元素
     268      */
     269     @Override
     270     public E get(int index) {
     271         rangeCheck(index);
     272         return elementData(index);
     273     }
     274 
     275     /**
     276      * 判断传入的下标是否比数组长度大
     277      * @param index
     278      */
     279     private void rangeCheck(int index) {
     280         if (index >= size)
     281             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
     282     }
     283     
     284     /**
     285      * 获取传入的index的长度和数组长度
     286      * @param index
     287      * @return
     288      */
     289     private String outOfBoundsMsg(int index) {
     290         return "Index: "+index+", Size: "+size;
     291     }
     292     
     293     /**
     294      * 修改index元素,将新的element放入集合index的位置,并返回oldelement
     295      */
     296     @Override
     297     public E set(int index, E element) {
     298         rangeCheck(index);
     299 
     300         E oldValue = elementData(index);
     301         elementData[index] = element;
     302         return oldValue;
     303     }
     304 
     305     /**
     306      * 新增元素
     307      */
     308     @Override
     309     public boolean add(E e) {
     310         //数组扩容,在内部会判断数组是否需要扩容,如果长度不足则扩容,否则不扩容
     311         ensureCapacityInternal(size + 1); 
     312         elementData[size++] = e;
     313         return true;
     314     }
     315 
     316     /**
     317      * 在指定位置插入元素
     318      */
     319     @Override
     320     public void add(int index, E element) {
     321         //判断index是否在集合长度范围内
     322         rangeCheckForAdd(index);
     323         //判断是否需要扩容
     324         ensureCapacityInternal(size + 1); 
     325         //将index以及后面的元素向后移动一位
     326         System.arraycopy(elementData, index, elementData, index + 1,
     327                          size - index);
     328         //简化element 放在 index的位置上
     329         elementData[index] = element;
     330         size++;
     331     }
     332 
     333     /**
     334      * 判断index是否在集合长度范围内
     335      * @param index
     336      */
     337     private void rangeCheckForAdd(int index) {
     338         if (index > size || index < 0)
     339             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
     340     }
     341     
     342     /**
     343      * 删除index的元素 ,并返回
     344      */
     345     @Override
     346     public E remove(int index) {
     347         rangeCheck(index);
     348 
     349         modCount++;
     350         E oldValue = elementData(index);
     351 
     352         //index 位置后面元素的个数
     353         int numMoved = size - index - 1;
     354         //如果index 后面存在元素,则向前移动一位
     355         if (numMoved > 0)
     356             System.arraycopy(elementData, index+1, elementData, index,
     357                              numMoved);
     358         //将最后一位置为null
     359         elementData[--size] = null; 
     360 
     361         return oldValue;
     362     }
     363     
     364     /**
     365      * 删除第一个元素 o
     366      */
     367     @Override
     368     public boolean remove(Object o) {
     369         if (o == null) {
     370             for (int index = 0; index < size; index++)
     371                 if (elementData[index] == null) {
     372                     //删除第一个 o元素
     373                     fastRemove(index);
     374                     return true;
     375                 }
     376         } else {
     377             for (int index = 0; index < size; index++)
     378                 if (o.equals(elementData[index])) {
     379                     fastRemove(index);
     380                     return true;
     381                 }
     382         }
     383         return false;
     384     }
     385     
     386     /**
     387      * 删除 index 位置的元素
     388      * @param index
     389      */
     390     private void fastRemove(int index) {
     391         modCount++;
     392         //index 位置后面元素的个数
     393         int numMoved = size - index - 1;
     394         //如果index 后面存在元素,则向前移动一位
     395         if (numMoved > 0)
     396             System.arraycopy(elementData, index+1, elementData, index,
     397                              numMoved);
     398         //将最后一位置为null
     399         elementData[--size] = null; 
     400     }
     401     
     402     /**
     403      * 清空集合
     404      */
     405     @Override
     406     public void clear() {
     407         modCount++;
     408 
     409         // 将每一个元素置null
     410         for (int i = 0; i < size; i++)
     411             elementData[i] = null;
     412 
     413         size = 0;
     414     }
     415     
     416     /**
     417      * 将c集合添加到本集合
     418      */
     419     @Override
     420     public boolean addAll(Collection<? extends E> c) {
     421         //转数组
     422         Object[] a = c.toArray();
     423         int numNew = a.length;
     424         //扩容 
     425         ensureCapacityInternal(size + numNew);  
     426         //copy数组,将a数组从0开始copy到 elementData,从size开始,copy numNew个元素
     427         System.arraycopy(a, 0, elementData, size, numNew);
     428         //修改长度
     429         size += numNew;
     430         return numNew != 0;
     431     }
     432     
     433     /**
     434      * 在index处,添加集合c
     435      */
     436     @Override
     437     public boolean addAll(int index, Collection<? extends E> c) {
     438         //判断index是否超出集合范围
     439         rangeCheckForAdd(index);
     440 
     441         Object[] a = c.toArray();
     442         int numNew = a.length;
     443         //数组扩容
     444         ensureCapacityInternal(size + numNew);  
     445 
     446         int numMoved = size - index;
     447         if (numMoved > 0)
     448             //将index后面的元素向后移动 c 集合中元素个数个长度
     449             System.arraycopy(elementData, index, elementData, index + numNew,
     450                              numMoved);
     451         //将a集合中的元素从0开始复制到elementData的index位置
     452         System.arraycopy(a, 0, elementData, index, numNew);
     453         //修改长度
     454         size += numNew;
     455         return numNew != 0;
     456     }
     457     
     458     /**
     459      * 删除fromIndex到toIndex的元素
     460      */
     461     @Override
     462     protected void removeRange(int fromIndex, int toIndex) {
     463         modCount++;
     464         int numMoved = size - toIndex;
     465         //将elementData 从 toIndex开始的元素 移动到fromIndex的位置,移动 numMoved个元素
     466         System.arraycopy(elementData, toIndex, elementData, fromIndex,
     467                          numMoved);
     468 
     469         int newSize = size - (toIndex-fromIndex);
     470         //将后面移动的元素的位置置为null
     471         for (int i = newSize; i < size; i++) {
     472             elementData[i] = null;
     473         }
     474         size = newSize;
     475     }
     476     
     477     /**
     478      * 删除集合中包含c集合中的元素
     479      */
     480     @Override
     481     public boolean removeAll(Collection<?> c) {
     482         //判断c是否为null
     483         Objects.requireNonNull(c);
     484         return batchRemove(c, false);
     485     }
     486     
     487     
     488     private boolean batchRemove(Collection<?> c, boolean complement) {
     489         final Object[] elementData = this.elementData;
     490         int r = 0, w = 0;
     491         boolean modified = false;
     492         try {
     493             for (; r < size; r++)
     494                 //w为下一个不重复元素的下标,r为目前遍历的元素下标,将不重复的元素放到w位置
     495                 if (c.contains(elementData[r]) == complement)
     496                     elementData[w++] = elementData[r];
     497         } finally {
     498             //如果上面的循环没有结束,则将没有遍历完的元素向前移动
     499             if (r != size) {
     500                 System.arraycopy(elementData, r,
     501                                  elementData, w,
     502                                  size - r);
     503                 w += size - r;
     504             }
     505             //将w后面的元素全部置为null
     506             if (w != size) {
     507                 for (int i = w; i < size; i++)
     508                     elementData[i] = null;
     509                 modCount += size - w;
     510                 //长度修改为w
     511                 size = w;
     512                 modified = true;
     513             }
     514         }
     515         return modified;
     516     }
     517     
     518     /**
     519      * 用于MyArrayList序列化使用
     520      * @param s
     521      * @throws java.io.IOException
     522      */
     523     private void writeObject(java.io.ObjectOutputStream s)
     524             throws java.io.IOException{
     525         // 首先先将非 transient 的进行序列化
     526         int expectedModCount = modCount;
     527         s.defaultWriteObject();
     528 
     529         // 再将集合的长度序列化
     530         s.writeInt(size);
     531 
     532         // 最后将,集合中非 null的进行序列化。我们知道集合初始化有10个长度,也许只用用几个,
     533         //那么这时序列化全部的话就会把后面没有使用的地址的null也序列化进去,这里序列化时,
     534         //调用此方法就会只序列化有值的区域,从而增加序列化效率,剪小序列化后的文件
     535         for (int i=0; i<size; i++) {
     536             s.writeObject(elementData[i]);
     537         }
     538         //如何在序列化过程中集合结构被其他线程修改,则序列化失败
     539         if (modCount != expectedModCount) {
     540             throw new ConcurrentModificationException();
     541         }
     542     }
     543     
     544     /**
     545      * 反序列化方法
     546      * @param s
     547      * @throws java.io.IOException
     548      * @throws ClassNotFoundException
     549      */
     550     private void readObject(java.io.ObjectInputStream s)
     551             throws java.io.IOException, ClassNotFoundException {
     552         elementData = EMPTY_ELEMENTDATA;
     553 
     554         // 首先将非transient 修饰的进行反序列化
     555         s.defaultReadObject();
     556         s.readInt(); 
     557 
     558         if (size > 0) {
     559             // 数组扩容
     560             ensureCapacityInternal(size);
     561 
     562             Object[] a = elementData;
     563             // 解析size个 元素进行反序列化
     564             for (int i=0; i<size; i++) {
     565                 a[i] = s.readObject();
     566             }
     567         }
     568     }
     569     
     570     /**
     571      * 获取从 index 开始的List迭代器
     572      */
     573     public ListIterator<E> listIterator(int index) {
     574         if (index < 0 || index > size)
     575             throw new IndexOutOfBoundsException("Index: "+index);
     576         return new ListItr(index);
     577     }
     578 
     579     /**
     580      * 获取从 0 开始的List迭代器
     581      */
     582     public ListIterator<E> listIterator() {
     583         return new ListItr(0);
     584     }
     585 
     586     /**
     587      * 获取迭代器
     588      */
     589     public Iterator<E> iterator() {
     590         return new Itr();
     591     }
     592     
     593     
     594     private class Itr implements Iterator<E> {
     595         
     596         int cursor;       // 迭代器指针指向的下一个元素的下标
     597         int lastRet = -1; // 迭代器指针跳过的上一个元素的下标,-1表示没有
     598         int expectedModCount = modCount;
     599 
     600         @Override
     601         public boolean hasNext() {
     602             return cursor != size;
     603         }
     604 
     605         @Override
     606         public E next() {
     607             //判断集合结构修改次数是否与迭代器修改次数相同
     608             checkForComodification();
     609             int i = cursor;
     610             if (i > size) {
     611                 throw new NoSuchElementException();
     612             }
     613             Object [] elementData = MyArrayList.this.elementData;
     614             if (i > elementData.length) {
     615                 throw new ConcurrentModificationException();
     616             }
     617             return null;
     618         }
     619         
     620         /**
     621          * 删除指针跳过的元素
     622          */
     623         public void remove() {
     624             if (lastRet < 0) {
     625                 throw new IllegalStateException();
     626             }
     627             checkForComodification();
     628             try {
     629                 //使用arrayList的删除方法
     630                 MyArrayList.this.remove(lastRet);
     631                 cursor = lastRet;
     632                 lastRet = -1;
     633                 expectedModCount = modCount;
     634             } catch (IndexOutOfBoundsException e) {
     635                 throw new ConcurrentModificationException();
     636             }
     637         }
     638         
     639         /**
     640          * java8新加入的方法,迭代集合,并自定义方法执行,但是这里需要注意的是,迭代的集合是从指针的下一个元素开始
     641          * 并不一定是从集合的开始执行,所以请谨慎使用
     642          */
     643         @SuppressWarnings("unchecked")
     644         public void forEachRemaining(Consumer<? super E> consumer) {
     645             //判断传入的方法是否为null
     646             Objects.requireNonNull(consumer);
     647             final int size = MyArrayList.this.size;
     648             int i = cursor;
     649             //指针在最后的位置
     650             if (i > size) {
     651                 return;
     652             }
     653             final Object [] elementData = MyArrayList.this.elementData;
     654             if (i >= elementData.length) {
     655                 throw new ConcurrentModificationException();
     656             }
     657             while(i != size && modCount == expectedModCount) {
     658                 consumer.accept((E)elementData[i++]);
     659             }
     660             cursor = i;
     661             lastRet = i - 1;
     662             checkForComodification();
     663         }
     664         
     665         /**
     666          * 判断集合结构修改次数是否与迭代器修改次数相同
     667          */
     668         final void checkForComodification() {
     669             if (modCount != expectedModCount)
     670                 throw new ConcurrentModificationException();
     671         }
     672         
     673     }
     674     
     675     /**
     676      * list 的迭代器
     677      *
     678      */
     679     private class ListItr extends Itr implements ListIterator<E> {
     680         
     681         ListItr(int index) {
     682             super();
     683             cursor = index;
     684         }
     685 
     686         /**
     687          * 是否存在上一个元素
     688          */
     689         public boolean hasPrevious() {
     690             return cursor != 0;
     691         }
     692 
     693         /**
     694          * 获取下一个元素的下标
     695          */
     696         public int nextIndex() {
     697             return cursor;
     698         }
     699 
     700         /**
     701          * 获取上一个元素的下标
     702          */
     703         public int previousIndex() {
     704             return cursor - 1;
     705         }
     706 
     707         /**
     708          * 获取上一个元素
     709          */
     710         @SuppressWarnings("unchecked")
     711         public E previous() {
     712             checkForComodification();
     713             int i = cursor - 1;
     714             //如果上一个元素下标小于0,说明不存在上一个元素
     715             if (i < 0)
     716                 throw new NoSuchElementException();
     717             Object[] elementData = MyArrayList.this.elementData;
     718             //如果上一个元素下标大于数组的长度,则抛出异常
     719             if (i >= elementData.length)
     720                 throw new ConcurrentModificationException();
     721             cursor = i;
     722             return (E) elementData[lastRet = i];
     723         }
     724         
     725         /**
     726          * 修改指针刚跳过的元素
     727          */
     728         public void set(E e) {
     729             //如果lastRet小于0 则说明没有跳过任何一个元素
     730             if (lastRet < 0)
     731                 throw new IllegalStateException();
     732             checkForComodification();
     733 
     734             try {
     735                 MyArrayList.this.set(lastRet, e);
     736             } catch (IndexOutOfBoundsException ex) {
     737                 throw new ConcurrentModificationException();
     738             }
     739         }
     740 
     741         /**
     742          * 在指针后加入元素
     743          */
     744         public void add(E e) {
     745             checkForComodification();
     746             try {
     747                 int i = cursor;
     748                 MyArrayList.this.add(i, e);
     749                 cursor = i + 1;
     750                 lastRet = -1;
     751                 expectedModCount = modCount;
     752             } catch (IndexOutOfBoundsException ex) {
     753                 throw new ConcurrentModificationException();
     754             }
     755         }
     756     }
     757     
     758     /**
     759      * 截取集合 从fromIndex 到 toIndex
     760      */
     761     public List<E> subList(int fromIndex, int toIndex) {
     762         subListRangeCheck(fromIndex, toIndex, size);
     763         return new SubList(this, 0, fromIndex, toIndex);
     764     }
     765 
     766     /**
     767      * 判断截取集合的位置是否正确
     768      * @param fromIndex
     769      * @param toIndex
     770      * @param size
     771      */
     772     static void subListRangeCheck(int fromIndex, int toIndex, int size) {
     773         if (fromIndex < 0)
     774             throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
     775         if (toIndex > size)
     776             throw new IndexOutOfBoundsException("toIndex = " + toIndex);
     777         if (fromIndex > toIndex)
     778             throw new IllegalArgumentException("fromIndex(" + fromIndex +
     779                                                ") > toIndex(" + toIndex + ")");
     780     }
     781     
     782     
     783     private class SubList extends AbstractList<E> implements RandomAccess {
     784         private final AbstractList<E> parent; //原集合
     785         private final int parentOffset; //开始位置
     786         private final int offset; //结束位置
     787         int size; //需要截取的元素的个数
     788 
     789         SubList(AbstractList<E> parent,
     790                 int offset, int fromIndex, int toIndex) {
     791             this.parent = parent;
     792             this.parentOffset = fromIndex;
     793             this.offset = offset + fromIndex;
     794             this.size = toIndex - fromIndex;
     795             this.modCount = MyArrayList.this.modCount;
     796         }
     797 
     798         /**
     799          * 修改index元素
     800          */
     801         public E set(int index, E e) {
     802             //判断index是否不在集合范围内
     803             rangeCheck(index);
     804             checkForComodification();
     805             //获取原来index位置的元素
     806             E oldValue = MyArrayList.this.elementData(offset + index);
     807             //使用e 替代原来位置的元素
     808             MyArrayList.this.elementData[offset + index] = e;
     809             return oldValue;
     810         }
     811 
     812         /**
     813          * index位置的元素
     814          */
     815         public E get(int index) {
     816             rangeCheck(index);
     817             checkForComodification();
     818             return MyArrayList.this.elementData(offset + index);
     819         }
     820 
     821         /**
     822          * 获取截取后元素的长度
     823          */
     824         public int size() {
     825             checkForComodification();
     826             return this.size;
     827         }
     828 
     829         /**
     830          * 截取后集合中新增元素,因为是在截取前的集合中直接操作,所以谨慎使用
     831          */
     832         public void add(int index, E e) {
     833             rangeCheckForAdd(index);
     834             checkForComodification();
     835             parent.add(parentOffset + index, e);
     836             this.modCount = parent.modCount;
     837             this.size++;
     838         }
     839 
     840         /**
     841          * 删除元素
     842          */
     843         public E remove(int index) {
     844             rangeCheck(index);
     845             checkForComodification();
     846             E result = parent.remove(parentOffset + index);
     847             this.modCount = parent.modCount;
     848             this.size--;
     849             return result;
     850         }
     851 
     852         /**
     853          * 删除从fromIndex开始到toIndex位置的元素
     854          */
     855         protected void removeRange(int fromIndex, int toIndex) {
     856             checkForComodification();
     857             parent.removeRange(parentOffset + fromIndex,
     858                                parentOffset + toIndex);
     859             this.modCount = parent.modCount;
     860             this.size -= toIndex - fromIndex;
     861         }
     862 
     863         /**
     864          * 新增传入集合的所有元素
     865          */
     866         public boolean addAll(Collection<? extends E> c) {
     867             return addAll(this.size, c);
     868         }
     869 
     870         /**
     871          * 在index位置后加入集合c中所有元素
     872          */
     873         public boolean addAll(int index, Collection<? extends E> c) {
     874             rangeCheckForAdd(index);
     875             int cSize = c.size();
     876             if (cSize==0)
     877                 return false;
     878 
     879             checkForComodification();
     880             parent.addAll(parentOffset + index, c);
     881             this.modCount = parent.modCount;
     882             this.size += cSize;
     883             return true;
     884         }
     885 
     886         /**
     887          * 获取迭代器
     888          */
     889         public Iterator<E> iterator() {
     890             return listIterator();
     891         }
     892 
     893         /**
     894          * 获取ListIterator迭代器
     895          */
     896         public ListIterator<E> listIterator(final int index) {
     897             checkForComodification();
     898             rangeCheckForAdd(index);
     899             final int offset = this.offset;
     900 
     901             return new ListIterator<E>() {
     902                 int cursor = index;
     903                 int lastRet = -1;
     904                 int expectedModCount = MyArrayList.this.modCount;
     905 
     906                 /**
     907                  * 判断是否存在下一个元素
     908                  */
     909                 public boolean hasNext() {
     910                     return cursor != SubList.this.size;
     911                 }
     912 
     913                 /**
     914                  * 获取下一个元素
     915                  */
     916                 @SuppressWarnings("unchecked")
     917                 public E next() {
     918                     checkForComodification();
     919                     int i = cursor;
     920                     if (i >= SubList.this.size)
     921                         throw new NoSuchElementException();
     922                     Object[] elementData = MyArrayList.this.elementData;
     923                     if (offset + i >= elementData.length)
     924                         throw new ConcurrentModificationException();
     925                     cursor = i + 1;
     926                     return (E) elementData[offset + (lastRet = i)];
     927                 }
     928 
     929                 /**
     930                  * 判断是否存在上一个元素
     931                  */
     932                 public boolean hasPrevious() {
     933                     return cursor != 0;
     934                 }
     935 
     936                 /**
     937                  * 获取上一个元素
     938                  */
     939                 @SuppressWarnings("unchecked")
     940                 public E previous() {
     941                     checkForComodification();
     942                     int i = cursor - 1;
     943                     if (i < 0)
     944                         throw new NoSuchElementException();
     945                     Object[] elementData = MyArrayList.this.elementData;
     946                     if (offset + i >= elementData.length)
     947                         throw new ConcurrentModificationException();
     948                     cursor = i;
     949                     return (E) elementData[offset + (lastRet = i)];
     950                 }
     951 
     952                 /**
     953                  * 循环遍历指针后面的元素,并执行consumer的方法
     954                  */
     955                 @SuppressWarnings("unchecked")
     956                 public void forEachRemaining(Consumer<? super E> consumer) {
     957                     Objects.requireNonNull(consumer);
     958                     final int size = SubList.this.size;
     959                     int i = cursor;
     960                     if (i >= size) {
     961                         return;
     962                     }
     963                     final Object[] elementData = MyArrayList.this.elementData;
     964                     if (offset + i >= elementData.length) {
     965                         throw new ConcurrentModificationException();
     966                     }
     967                     while (i != size && modCount == expectedModCount) {
     968                         consumer.accept((E) elementData[offset + (i++)]);
     969                     }
     970                     lastRet = cursor = i;
     971                     checkForComodification();
     972                 }
     973 
     974                 /**
     975                  * 获取下一个元素
     976                  */
     977                 public int nextIndex() {
     978                     return cursor;
     979                 }
     980 
     981                 /**
     982                  * 获取上一个元素
     983                  */
     984                 public int previousIndex() {
     985                     return cursor - 1;
     986                 }
     987 
     988                 /**
     989                  * 删除元素
     990                  */
     991                 public void remove() {
     992                     if (lastRet < 0)
     993                         throw new IllegalStateException();
     994                     checkForComodification();
     995 
     996                     try {
     997                         SubList.this.remove(lastRet);
     998                         cursor = lastRet;
     999                         lastRet = -1;
    1000                         expectedModCount = MyArrayList.this.modCount;
    1001                     } catch (IndexOutOfBoundsException ex) {
    1002                         throw new ConcurrentModificationException();
    1003                     }
    1004                 }
    1005 
    1006                 /**
    1007                  * 修改元素
    1008                  */
    1009                 public void set(E e) {
    1010                     if (lastRet < 0)
    1011                         throw new IllegalStateException();
    1012                     checkForComodification();
    1013 
    1014                     try {
    1015                         MyArrayList.this.set(offset + lastRet, e);
    1016                     } catch (IndexOutOfBoundsException ex) {
    1017                         throw new ConcurrentModificationException();
    1018                     }
    1019                 }
    1020 
    1021                 /**
    1022                  * 新增元素
    1023                  */
    1024                 public void add(E e) {
    1025                     checkForComodification();
    1026 
    1027                     try {
    1028                         int i = cursor;
    1029                         SubList.this.add(i, e);
    1030                         cursor = i + 1;
    1031                         lastRet = -1;
    1032                         expectedModCount = MyArrayList.this.modCount;
    1033                     } catch (IndexOutOfBoundsException ex) {
    1034                         throw new ConcurrentModificationException();
    1035                     }
    1036                 }
    1037 
    1038                 final void checkForComodification() {
    1039                     if (expectedModCount != MyArrayList.this.modCount)
    1040                         throw new ConcurrentModificationException();
    1041                 }
    1042             };
    1043         }
    1044 
    1045         /**
    1046          * 截取集合从fromIndex到toIndex
    1047          */
    1048         public List<E> subList(int fromIndex, int toIndex) {
    1049             subListRangeCheck(fromIndex, toIndex, size);
    1050             return new SubList(this, offset, fromIndex, toIndex);
    1051         }
    1052 
    1053         private void rangeCheck(int index) {
    1054             if (index < 0 || index >= this.size)
    1055                 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    1056         }
    1057 
    1058         private void rangeCheckForAdd(int index) {
    1059             if (index < 0 || index > this.size)
    1060                 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    1061         }
    1062 
    1063         private String outOfBoundsMsg(int index) {
    1064             return "Index: "+index+", Size: "+this.size;
    1065         }
    1066 
    1067         private void checkForComodification() {
    1068             if (MyArrayList.this.modCount != this.modCount)
    1069                 throw new ConcurrentModificationException();
    1070         }
    1071 
    1072         public Spliterator<E> spliterator() {
    1073             checkForComodification();
    1074             return new ArrayListSpliterator<E>(MyArrayList.this, offset,
    1075                                                offset + this.size, this.modCount);
    1076         }
    1077     }
    1078     
    1079     /**
    1080      * 遍历集合,其中每个元素执行action中的方法
    1081      */
    1082     @Override
    1083     public void forEach(Consumer<? super E> action) {
    1084         Objects.requireNonNull(action);
    1085         final int expectedModCount = modCount;
    1086         @SuppressWarnings("unchecked")
    1087         final E[] elementData = (E[]) this.elementData;
    1088         final int size = this.size;
    1089         for (int i=0; modCount == expectedModCount && i < size; i++) {
    1090             action.accept(elementData[i]);
    1091         }
    1092         if (modCount != expectedModCount) {
    1093             throw new ConcurrentModificationException();
    1094         }
    1095     }
    1096 
    1097     /**
    1098      * 获取Spliterator迭代器 java8提供
    1099      */
    1100     @Override
    1101     public Spliterator<E> spliterator() {
    1102         return new ArrayListSpliterator<>(this, 0, -1, 0);
    1103     }
    1104 
    1105     static final class ArrayListSpliterator<E> implements Spliterator<E> {
    1106 
    1107 
    1108         private final MyArrayList<E> list; //集合
    1109         private int index; //起始位置
    1110         private int fence; //结束位置 -1表示最后
    1111         private int expectedModCount; //结构改变次数
    1112 
    1113        
    1114         ArrayListSpliterator(MyArrayList<E> list, int origin, int fence,
    1115                              int expectedModCount) {
    1116             this.list = list; 
    1117             this.index = origin;
    1118             this.fence = fence;
    1119             this.expectedModCount = expectedModCount;
    1120         }
    1121 
    1122         /**
    1123          * 获取结束位置
    1124          * @return
    1125          */
    1126         private int getFence() { 
    1127             int hi; 
    1128             MyArrayList<E> lst;
    1129             //如果fence = -1则说明已经到达最后位置
    1130             if ((hi = fence) < 0) {
    1131                 //如果集合为null则最后位置为0
    1132                 if ((lst = list) == null)
    1133                     hi = fence = 0;
    1134                 else {
    1135                     //否则返回集合长度
    1136                     expectedModCount = lst.modCount;
    1137                     hi = fence = lst.size;
    1138                 }
    1139             }
    1140             return hi;
    1141         }
    1142 
    1143         /**
    1144          * 分割迭代器,每调用一次,将原来的迭代器等分为两份,并返回索引靠前的那一个子迭代器。
    1145          */
    1146         public ArrayListSpliterator<E> trySplit() {
    1147             int hi = getFence(), lo = index, mid = (lo + hi) >>> 1;
    1148             return (lo >= mid) ? null : 
    1149                 new ArrayListSpliterator<E>(list, lo, index = mid,
    1150                                             expectedModCount);
    1151         }
    1152 
    1153         /**
    1154          * 获取下一个元素并执行action方法
    1155          */
    1156         public boolean tryAdvance(Consumer<? super E> action) {
    1157             if (action == null)
    1158                 throw new NullPointerException();
    1159             int hi = getFence(), i = index;
    1160             //如果开始位置小于结束
    1161             if (i < hi) {
    1162                 index = i + 1;
    1163                 //则获取下一个元素
    1164                 @SuppressWarnings("unchecked") E e = (E)list.elementData[i];
    1165                 //执行action的方法
    1166                 action.accept(e);
    1167                 if (list.modCount != expectedModCount)
    1168                     throw new ConcurrentModificationException();
    1169                 return true;
    1170             }
    1171             return false;
    1172         }
    1173 
    1174         /**
    1175          * 循环执行action方法
    1176          */
    1177         public void forEachRemaining(Consumer<? super E> action) {
    1178             int i, hi, mc; 
    1179             MyArrayList<E> lst; Object[] a;
    1180             if (action == null)
    1181                 throw new NullPointerException();
    1182             if ((lst = list) != null && (a = lst.elementData) != null) {
    1183                 if ((hi = fence) < 0) {
    1184                     mc = lst.modCount;
    1185                     hi = lst.size;
    1186                 }
    1187                 else
    1188                     mc = expectedModCount;
    1189                 if ((i = index) >= 0 && (index = hi) <= a.length) {
    1190                     for (; i < hi; ++i) {
    1191                         @SuppressWarnings("unchecked") E e = (E) a[i];
    1192                         action.accept(e);
    1193                     }
    1194                     if (lst.modCount == mc)
    1195                         return;
    1196                 }
    1197             }
    1198             throw new ConcurrentModificationException();
    1199         }
    1200 
    1201         public long estimateSize() {
    1202             return (long) (getFence() - index);
    1203         }
    1204 
    1205         public int characteristics() {
    1206             return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED;
    1207         }
    1208     }
    1209 
    1210     /**
    1211      * 如果集合中元素在一定条件内就删除,条件由开发者传入
    1212      */
    1213     @Override
    1214     public boolean removeIf(Predicate<? super E> filter) {
    1215         Objects.requireNonNull(filter);
    1216         int removeCount = 0;
    1217         //创建一个size长度的BitSet
    1218         final BitSet removeSet = new BitSet(size);
    1219         final int expectedModCount = modCount;
    1220         final int size = this.size;
    1221         for (int i=0; modCount == expectedModCount && i < size; i++) {
    1222             @SuppressWarnings("unchecked")
    1223             final E element = (E) elementData[i];
    1224             if (filter.test(element)) {
    1225                 //将removeSet的 i 位置 设置为true
    1226                 removeSet.set(i);
    1227                 removeCount++;
    1228             }
    1229         }
    1230         if (modCount != expectedModCount) {
    1231             throw new ConcurrentModificationException();
    1232         }
    1233         //判读是否有元素需要被删除
    1234         final boolean anyToRemove = removeCount > 0;
    1235         if (anyToRemove) {
    1236             //获取删除元素后 数组的长度
    1237             final int newSize = size - removeCount;
    1238             for (int i=0, j=0; (i < size) && (j < newSize); i++, j++) {
    1239                 //获取removeSet中i后面第一个为false的元素下标,
    1240                 i = removeSet.nextClearBit(i);
    1241                 elementData[j] = elementData[i];
    1242             }
    1243             //将删除结束后,新数组长度后面的元素全部置为null、
    1244             for (int k=newSize; k < size; k++) {
    1245                 elementData[k] = null;  
    1246             }
    1247             this.size = newSize;
    1248             if (modCount != expectedModCount) {
    1249                 throw new ConcurrentModificationException();
    1250             }
    1251             modCount++;
    1252         }
    1253 
    1254         return anyToRemove;
    1255     }
    1256 
    1257     /**
    1258      * 按照一定的规则对集合进行操作,规则由开发者传入
    1259      */
    1260     @Override
    1261     @SuppressWarnings("unchecked")
    1262     public void replaceAll(UnaryOperator<E> operator) {
    1263         Objects.requireNonNull(operator);
    1264         final int expectedModCount = modCount;
    1265         final int size = this.size;
    1266         //循环遍历每一个元素,并执行规则
    1267         for (int i=0; modCount == expectedModCount && i < size; i++) {
    1268             elementData[i] = operator.apply((E) elementData[i]);
    1269         }
    1270         if (modCount != expectedModCount) {
    1271             throw new ConcurrentModificationException();
    1272         }
    1273         modCount++;
    1274     }
    1275 
    1276     /**
    1277      * java8中新加入的方法,按照一定的规则进行排序
    1278      */
    1279     @Override
    1280     @SuppressWarnings("unchecked")
    1281     public void sort(Comparator<? super E> c) {
    1282         final int expectedModCount = modCount;
    1283         //调用arrays的方法传入数组,从0开始size个元素,按照c的规则进行排序 
    1284         Arrays.sort((E[]) elementData, 0, size, c);
    1285         if (modCount != expectedModCount) {
    1286             throw new ConcurrentModificationException();
    1287         }
    1288         modCount++;
    1289     }
    1290 
    1291 }

       以上就是我在学习线性表时的一些感悟以及对ArrayList以及相关的一些接口,父类的源码的解读,其中代码中的注释均是我自己在读源码过程中的理解。如过有地方理解的和大家理解的不一样,还请提出来一起探讨。

    -------------------- END ---------------------

     

    最后附上作者的微信公众号地址和博客地址 

    公众号:wuyouxin_gzh

     

    Herrt灬凌夜:https://www.cnblogs.com/wuyx/

    版权说明:欢迎以任何方式进行转载,但请在转载后注明出处!

  • 相关阅读:
    1201JavaScript事件(Events)
    1201Js对象##正则表达式##
    CSS样式表基本概念
    1124Js基础语法
    网页学习大纲(1116/1130适用于预习或复习)
    1117网页基础--表单
    1117网页基础--框架frameset / iframe
    数据库基础(触发器)
    数据库基础(视图)
    数据库基础(定义变量来查询的练习、存储过程)
  • 原文地址:https://www.cnblogs.com/wuyx/p/9351964.html
Copyright © 2011-2022 走看看