[关闭]
@zero1036 2017-03-14T17:11:52.000000Z 字数 2315 阅读 1335

ArrayList源码分析

Java-Base


简述

ArrayList 是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。

  1. 快速随机访问:实现RandmoAccess接口,提供随机访问功能,可以通过元素的序号快速获取元素对象;
  2. 线程安全:非线程安全;
  3. 序列化:实现Serializable这些接口接口,支持序列化。

继承关系如下:

  1. java.lang.Object
  2. java.util.AbstractCollection<E>
  3. java.util.AbstractList<E>
  4. java.util.ArrayList<E>
  5. public class ArrayList<E> extends AbstractList<E>
  6. implements List<E>, RandomAccess, Cloneable, java.io.Serializable {}

添加元素--add()

  1. public boolean add(E e) {
  2. // 确定ArrayList的容量大小
  3. ensureCapacityInternal(size + 1); // Increments modCount!!
  4. // 添加e到ArrayList中
  5. elementData[size++] = e;
  6. return true;
  7. }
  8. private void ensureCapacityInternal(int minCapacity) {
  9. //minCapacity:最小容量 = size + 1(当执行add方法时)
  10. if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
  11. minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
  12. }
  13. ensureExplicitCapacity(minCapacity);
  14. }
  15. private void ensureExplicitCapacity(int minCapacity) {
  16. modCount++;
  17. // overflow-conscious code
  18. if (minCapacity - elementData.length > 0)
  19. grow(minCapacity);
  20. }
  21. private void grow(int minCapacity) {
  22. // overflow-conscious code
  23. int oldCapacity = elementData.length;
  24. //新容量 = 旧容量 + 旧容量二进制位数右移1位 (例:15 = 10 + 5),即,每次扩容都增加原始容量的二分一,减少执行Arrays.copyOf()
  25. int newCapacity = oldCapacity + (oldCapacity >> 1);
  26. if (newCapacity - minCapacity < 0)
  27. newCapacity = minCapacity;
  28. if (newCapacity - MAX_ARRAY_SIZE > 0)
  29. newCapacity = hugeCapacity(minCapacity);
  30. // minCapacity is usually close to size, so this is a win:
  31. elementData = Arrays.copyOf(elementData, newCapacity);
  32. }
  33. public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
  34. @SuppressWarnings("unchecked")
  35. //验证参数是否Object[]数组,是:new Object[];否:调用Arrays的native方法newArray()
  36. T[] copy = ((Object)newType == (Object)Object[].class)
  37. ? (T[]) new Object[newLength]
  38. : (T[]) Array.newInstance(newType.getComponentType(), newLength);
  39. //最后执行方法System.arraycopy(),调用native方法arraycopy();参数24:源数组与目标数组的起始复制位,默认为0、0
  40. System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
  41. return copy;
  42. }

Collections排序--Collections.sort()

Collections排序采用Timsort排序实现,参考:Timsort排序算法

使用方法:

  1. List list = new ArrayList<Integer>();
  2. ...
  3. Collections.sort(list, new Comparator<Integer>() {
  4. /**
  5. * 升序:Comparator.compare(右元素, 左元素) >= 0;
  6. * 降序:Comparator.compare(右元素, 左元素) < 0
  7. */
  8. public int compare(Integer o1, Integer o2) {
  9. if (o2 > o1) {
  10. return 1;
  11. } else {
  12. return -1;
  13. }
  14. }
  15. });

Arrays排序--Arrays.sort()

去重

关于线程安全

java.util.ArrayList并非java API的线程安全类型,而java.util.Vector(矢量队列)则可以理解是ArrayList的线程安全版本。但以上两者都不是绝对的线程安全。参考:Vector源码分析

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注