1 package java.util; 2 3 public class ArrayList<E> extends AbstractList<E> 4 implements List<E>, RandomAccess, Cloneable, java.io.Serializable 5 { 6 // 序列版本号 7 private static final long serialVersionUID = 8683452581122892189L; 8 9 // 保存ArrayList中数据的数组 10 private transient Object[] elementData; 11 12 // ArrayList中实际数据的数量 13 private int size; 14 15 // ArrayList带容量大小的构造函数。 16 public ArrayList(int initialCapacity) { 17 super(); 18 if (initialCapacity < 0) 19 throw new IllegalArgumentException("Illegal Capacity: "+ 20 initialCapacity); 21 // 新建一个数组 22 this.elementData = new Object[initialCapacity]; 23 } 24 25 // ArrayList构造函数。默认容量是10。 26 public ArrayList() { 27 this(10); 28 } 29 30 // 创建一个包含collection的ArrayList 31 public ArrayList(Collection<? extends E> c) { 32 elementData = c.toArray(); 33 size = elementData.length; 34 // c.toArray might (incorrectly) not return Object[] (see 6260652) 35 if (elementData.getClass() != Object[].class) 36 elementData = Arrays.copyOf(elementData, size, Object[].class); 37 } 38 39 40 // 将当前容量值设为 =实际元素个数 41 public void trimToSize() { 42 modCount++; 43 int oldCapacity = elementData.length; 44 if (size < oldCapacity) { 45 elementData = Arrays.copyOf(elementData, size); 46 } 47 } 48 49 50 // 确定ArrarList的容量。 51 // 若ArrayList的容量不足以容纳当前的全部元素,设置 新的容量=“(原始容量x3)/2 + 1” 52 public void ensureCapacity(int minCapacity) { 53 // 将“修改统计数”+1 54 modCount++; 55 int oldCapacity = elementData.length; 56 // 若当前容量不足以容纳当前的元素个数,设置 新的容量=“(原始容量x3)/2 + 1” 57 if (minCapacity > oldCapacity) { 58 Object oldData[] = elementData; 59 int newCapacity = (oldCapacity * 3)/2 + 1; 60 if (newCapacity < minCapacity) 61 newCapacity = minCapacity; 62 elementData = Arrays.copyOf(elementData, newCapacity); 63 } 64 } 65 66 // 添加元素e 67 public boolean add(E e) { 68 // 确定ArrayList的容量大小 69 ensureCapacity(size + 1); // Increments modCount!! 70 // 添加e到ArrayList中 71 elementData[size++] = e; 72 return true; 73 } 74 75 // 返回ArrayList的实际大小 76 public int size() { 77 return size; 78 } 79 80 // 返回ArrayList是否包含Object(o) 81 public boolean contains(Object o) { 82 return indexOf(o) >= 0; 83 } 84 85 // 返回ArrayList是否为空 86 public boolean isEmpty() { 87 return size == 0; 88 } 89 90 // 正向查找,返回元素的索引值 91 public int indexOf(Object o) { 92 if (o == null) { 93 for (int i = 0; i < size; i++) 94 if (elementData[i]==null) 95 return i; 96 } else { 97 for (int i = 0; i < size; i++) 98 if (o.equals(elementData[i])) 99 return i;100 }101 return -1;102 }103 104 // 反向查找,返回元素的索引值 105 public int lastIndexOf(Object o) {106 if (o == null) {107 for (int i = size-1; i >= 0; i--)108 if (elementData[i]==null)109 return i;110 } else {111 for (int i = size-1; i >= 0; i--)112 if (o.equals(elementData[i]))113 return i;114 }115 return -1;116 }117 118 // 反向查找(从数组末尾向开始查找),返回元素(o)的索引值 119 public int lastIndexOf(Object o) {120 if (o == null) {121 for (int i = size-1; i >= 0; i--)122 if (elementData[i]==null)123 return i;124 } else {125 for (int i = size-1; i >= 0; i--)126 if (o.equals(elementData[i]))127 return i;128 }129 return -1;130 }131 132 133 // 返回ArrayList的Object数组 134 public Object[] toArray() {135 return Arrays.copyOf(elementData, size);136 }137 138 // 返回ArrayList的模板数组。所谓模板数组,即可以将T设为任意的数据类型 139 public <T> T[] toArray(T[] a) {140 // 若数组a的大小 < ArrayList的元素个数;141 // 则新建一个T[]数组,数组大小是“ArrayList的元素个数”,并将“ArrayList”全部拷贝到新数组中 142 if (a.length < size)143 return (T[]) Arrays.copyOf(elementData, size, a.getClass());144 145 // 若数组a的大小 >= ArrayList的元素个数;146 // 则将ArrayList的全部元素都拷贝到数组a中。 147 System.arraycopy(elementData, 0, a, 0, size);148 if (a.length > size)149 a[size] = null;150 return a;151 }152 153 // 获取index位置的元素值 154 public E get(int index) {155 RangeCheck(index);156 157 return (E) elementData[index];158 }159 160 // 设置index位置的值为element 161 public E set(int index, E element) {162 RangeCheck(index);163 164 E oldValue = (E) elementData[index];165 elementData[index] = element;166 return oldValue;167 }168 169 // 将e添加到ArrayList中 170 public boolean add(E e) {171 ensureCapacity(size + 1); // Increments modCount!! 172 elementData[size++] = e;173 return true;174 }175 176 // 将e添加到ArrayList的指定位置 177 public void add(int index, E element) {178 if (index > size || index < 0)179 throw new IndexOutOfBoundsException(180 "Index: "+index+", Size: "+size);181 182 ensureCapacity(size+1); // Increments modCount!! 183 System.arraycopy(elementData, index, elementData, index + 1,184 size - index);185 elementData[index] = element;186 size++;187 }188 189 // 删除ArrayList指定位置的元素 190 public E remove(int index) {191 RangeCheck(index);192 193 modCount++;194 E oldValue = (E) elementData[index];195 196 int numMoved = size - index - 1;197 if (numMoved > 0)198 System.arraycopy(elementData, index+1, elementData, index,199 numMoved);200 elementData[--size] = null; // Let gc do its work 201 202 return oldValue;203 }204 205 // 删除ArrayList的指定元素 206 public boolean remove(Object o) {207 if (o == null) {208 for (int index = 0; index < size; index++)209 if (elementData[index] == null) {210 fastRemove(index);211 return true;212 }213 } else {214 for (int index = 0; index < size; index++)215 if (o.equals(elementData[index])) {216 fastRemove(index);217 return true;218 }219 }220 return false;221 }222 223 224 // 快速删除第index个元素 225 private void fastRemove(int index) {226 modCount++;227 int numMoved = size - index - 1;228 // 从"index+1"开始,用后面的元素替换前面的元素。 229 if (numMoved > 0)230 System.arraycopy(elementData, index+1, elementData, index,231 numMoved);232 // 将最后一个元素设为null 233 elementData[--size] = null; // Let gc do its work 234 }235 236 // 删除元素 237 public boolean remove(Object o) {238 if (o == null) {239 for (int index = 0; index < size; index++)240 if (elementData[index] == null) {241 fastRemove(index);242 return true;243 }244 } else {245 // 便利ArrayList,找到“元素o”,则删除,并返回true。 246 for (int index = 0; index < size; index++)247 if (o.equals(elementData[index])) {248 fastRemove(index);249 return true;250 }251 }252 return false;253 }254 255 // 清空ArrayList,将全部的元素设为null 256 public void clear() {257 modCount++;258 259 for (int i = 0; i < size; i++)260 elementData[i] = null;261 262 size = 0;263 }264 265 // 将集合c追加到ArrayList中 266 public boolean addAll(Collection<? extends E> c) {267 Object[] a = c.toArray();268 int numNew = a.length;269 ensureCapacity(size + numNew); // Increments modCount 270 System.arraycopy(a, 0, elementData, size, numNew);271 size += numNew;272 return numNew != 0;273 }274 275 // 从index位置开始,将集合c添加到ArrayList 276 public boolean addAll(int index, Collection<? extends E> c) {277 if (index > size || index < 0)278 throw new IndexOutOfBoundsException(279 "Index: " + index + ", Size: " + size);280 281 Object[] a = c.toArray();282 int numNew = a.length;283 ensureCapacity(size + numNew); // Increments modCount 284 285 int numMoved = size - index;286 if (numMoved > 0)287 System.arraycopy(elementData, index, elementData, index + numNew,288 numMoved);289 290 System.arraycopy(a, 0, elementData, index, numNew);291 size += numNew;292 return numNew != 0;293 }294 295 // 删除fromIndex到toIndex之间的全部元素。 296 protected void removeRange(int fromIndex, int toIndex) {297 modCount++;298 int numMoved = size - toIndex;299 System.arraycopy(elementData, toIndex, elementData, fromIndex,300 numMoved);301 302 // Let gc do its work 303 int newSize = size - (toIndex-fromIndex);304 while (size != newSize)305 elementData[--size] = null;306 }307 308 private void RangeCheck(int index) {309 if (index >= size)310 throw new IndexOutOfBoundsException(311 "Index: "+index+", Size: "+size);312 }313 314 315 // 克隆函数 316 public Object clone() {317 try {318 ArrayList<E> v = (ArrayList<E>) super.clone();319 // 将当前ArrayList的全部元素拷贝到v中 320 v.elementData = Arrays.copyOf(elementData, size);321 v.modCount = 0;322 return v;323 } catch (CloneNotSupportedException e) {324 // this shouldn't happen, since we are Cloneable 325 throw new InternalError();326 }327 }328 329 330 // java.io.Serializable的写入函数331 // 将ArrayList的“容量,所有的元素值”都写入到输出流中 332 private void writeObject(java.io.ObjectOutputStream s)333 throws java.io.IOException{334 // Write out element count, and any hidden stuff 335 int expectedModCount = modCount;336 s.defaultWriteObject();337 338 // 写入“数组的容量” 339 s.writeInt(elementData.length);340 341 // 写入“数组的每一个元素” 342 for (int i=0; i<size; i++)343 s.writeObject(elementData[i]);344 345 if (modCount != expectedModCount) {346 throw new ConcurrentModificationException();347 }348 349 }350 351 352 // java.io.Serializable的读取函数:根据写入方式读出353 // 先将ArrayList的“容量”读出,然后将“所有的元素值”读出 354 private void readObject(java.io.ObjectInputStream s)355 throws java.io.IOException, ClassNotFoundException {356 // Read in size, and any hidden stuff 357 s.defaultReadObject();358 359 // 从输入流中读取ArrayList的“容量” 360 int arrayLength = s.readInt();361 Object[] a = elementData = new Object[arrayLength];362 363 // 从输入流中将“所有的元素值”读出 364 for (int i=0; i<size; i++)365 a[i] = s.readObject();366 }367 }