学习所得来源于b站韩顺平java精讲系列

ArrayList的注意事项

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

    底层操作机制源码分析

  • ArrayList中维护了一个Object类型的属组elementData

    • transient Object[] elementData;
    • transient表示瞬间,短暂的,表示该属性不会被序列化
  • 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则扩容elementData为10,如果需要再次扩容,则扩容elementData为1.5倍
  • 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍

1.分析使用无参构造器,创建和使用ArrayList的源码

代码演示

  1. public class ArrayListSource {
  2. public static void main(String[] args) {
  3. ArrayList list = new ArrayList();
  4. for (int i = 1; i <= 10 ; i++) {
  5. list.add(i);
  6. }
  7. for (int i = 11; i <= 15 ; i++) {
  8. list.add(i);
  9. }
  10. list.add(100);
  11. list.add(200);
  12. list.add(300);
  13. }
  14. }

ArrayList的底层机制和源码分析 - 图1

2.分析使用有参构造器,创建和使用ArrayList的源码

1.创建指定大小的elementData数组: this.elementData = new Object[指定的大小];

  1. public ArrayList(int initialCapacity) {
  2. if (initialCapacity > 0) {
  3. this.elementData = new Object[initialCapacity];
  4. } else if (initialCapacity == 0) {
  5. this.elementData = EMPTY_ELEMENTDATA;
  6. } else {
  7. throw new IllegalArgumentException("Illegal Capacity: "+
  8. initialCapacity);
  9. }

2.添加元素的操作与无参构造相同(同上)
3.只是在扩容的时候,会直接扩容为定义数组大小的1.5倍

  1. private void grow(int minCapacity) {
  2. // overflow-conscious code
  3. int oldCapacity = elementData.length;
  4. int newCapacity = oldCapacity + (oldCapacity >> 1);
  5. if (newCapacity - minCapacity < 0)
  6. newCapacity = minCapacity;//数组长度赋值给新的值
  7. if (newCapacity - MAX_ARRAY_SIZE > 0)
  8. newCapacity = hugeCapacity(minCapacity);
  9. // minCapacity is usually close to size, so this is a win:
  10. elementData = Arrays.copyOf(elementData, newCapacity);
  11. }