ArrayList的注意事项

  1. 1permits all elements,including null,ArrayList可以加入null值,并且可以加入多个
  2. 2ArrayList是由数组来实现数据存储的
  3. 3ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高)看源码,
  4. 在多线程情况下,不建议使用ArrayList

ArrayList底层结构和源码分析

ArrayList的底层操作机制源码分析(重点、难点)

  1. 1ArrayList中维护了一个Object类型的数组elementData.[debug看源码]
  2. transient Object[] elementData; // 表示瞬间的,短暂的,表示该属性不会被序列化
  3. 2)当创建ArrayList对象时,如果使用的是无参构造,则初始elementData容量为0
  4. 第一次添加,则扩容elementData10,如果需要再次扩容,则扩容elementData1.5倍。
  5. 3)如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,
  6. 则直接扩容elementData1.5倍。

ArrayList源码分析

  1. // 1.创建一个空的elementData数组{}
  2. public ArrayList() {
  3. super();
  4. this.elementData = EMPTY_ELEMENTDATA;
  5. }
  6. // 2.执行list.add
  7. public boolean add(E e) {
  8. ensureCapacityInternal(size + 1); // Increments modCount!!
  9. elementData[size++] = e;
  10. return true;
  11. }
  12. // 先确定是否要扩容,然后再执行赋值
  13. // 3.该方法,确定minCapacity,第一次扩容为10
  14. private void ensureCapacityInternal(int minCapacity) {
  15. if (elementData == EMPTY_ELEMENTDATA) {
  16. minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
  17. }
  18. ensureExplicitCapacity(minCapacity);
  19. }
  20. // 4.modCount++记录几何被修改的次数
  21. // 如果elementData的大小不够,就调用grow()扩容
  22. private void ensureExplicitCapacity(int minCapacity) {
  23. modCount++;
  24. // overflow-conscious code
  25. if (minCapacity - elementData.length > 0)
  26. grow(minCapacity);
  27. }
  28. /*
  29. 5.1 真的扩容
  30. 5.2 使用扩容机制来确定要扩容到多大
  31. 5.3 第一次newCapacity = 10
  32. 5.4 第二次及以后按照1.5倍扩容
  33. 5.5 扩容使用的是Arrays.copyOf()
  34. */
  35. private void grow(int minCapacity) {
  36. // overflow-conscious code
  37. int oldCapacity = elementData.length;
  38. int newCapacity = oldCapacity + (oldCapacity >> 1);
  39. if (newCapacity - minCapacity < 0)
  40. newCapacity = minCapacity;
  41. if (newCapacity - MAX_ARRAY_SIZE > 0)
  42. newCapacity = hugeCapacity(minCapacity);
  43. // minCapacity is usually close to size, so this is a win:
  44. elementData = Arrays.copyOf(elementData, newCapacity);
  45. }