ArrayList源码分析

1、初始化对象

  1. /**
  2. * Default initial capacity.
  3. */
  4. private static final int DEFAULT_CAPACITY = 10;
  5. /**
  6. * Shared empty array instance used for empty instances.
  7. */
  8. private static final Object[] EMPTY_ELEMENTDATA = {};
  9. /**
  10. * Shared empty array instance used for default sized empty instances. We
  11. * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
  12. * first element is added.
  13. */
  14. private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
  15. public ArrayList() {
  16. this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  17. }

默认构造一个长度为0的数组。

2、向集合中添加元素

  1. public boolean add(E e) {
  2. ensureCapacityInternal(size + 1); // Increments modCount!!
  3. elementData[size++] = e;
  4. return true;
  5. }
  6. private void ensureCapacityInternal(int minCapacity) {
  7. if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
  8. minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
  9. }
  10. ensureExplicitCapacity(minCapacity);
  11. }
  12. private void ensureExplicitCapacity(int minCapacity) {
  13. modCount++;
  14. // overflow-conscious code
  15. if (minCapacity - elementData.length > 0)
  16. grow(minCapacity);
  17. }
  18. private void grow(int minCapacity) {
  19. // overflow-conscious code
  20. int oldCapacity = elementData.length;
  21. // 新数组长度 = 旧数组长度 + 旧数组长度/2
  22. int newCapacity = oldCapacity + (oldCapacity >> 1);
  23. if (newCapacity - minCapacity < 0)
  24. newCapacity = minCapacity;
  25. if (newCapacity - MAX_ARRAY_SIZE > 0)
  26. newCapacity = hugeCapacity(minCapacity);
  27. // minCapacity is usually close to size, so this is a win:
  28. elementData = Arrays.copyOf(elementData, newCapacity);
  29. }

当像集合中添加元素时,系统会判断是否需要扩容(如果没有没有设置集合的大小,添加元素时系统会默认创建10个大小空间的数组),当此时已经超出数组的容量,就会进行扩容,扩容规则为:将旧数组大小加上旧数组大小右移一位(旧数组大小除以2),创建一个长度为扩容后的数组,并将旧数组里面的数据复制到新数组中,然后向数组尾部插入添加的那个元素。