顺序存储线性表_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方法,在这里只是抛出异常,子类如果直接调用,则会抛出异常, |
remove | int index | E |
List 接口中的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/
版权说明:欢迎以任何方式进行转载,但请在转载后注明出处!