ArrayList源码解析

来源:互联网 发布:十大必看电影 知乎 编辑:程序博客网 时间:2024/05/16 12:11

ArrayList作为java集合框架里最基础的一环,它的底层是一个简单的数组

先给出它的类图

首先是构造方法和成员变量

  private static final long serialVersionUID = 8683452581122892189L;  private transient Object[] elementData;  private int size;   public ArrayList(int paramInt)  {    if (paramInt < 0) {      throw new IllegalArgumentException("Illegal Capacity: " + paramInt);    }    this.elementData = new Object[paramInt];  }    public ArrayList()  {    this(10);  }  public ArrayList(Collection<? extends E> paramCollection)  {    this.elementData = paramCollection.toArray();    this.size = this.elementData.length;    if (this.elementData.getClass() != [Ljava.lang.Object.class) {      this.elementData = Arrays.copyOf(this.elementData, this.size, [Ljava.lang.Object.class);    }  }
可以看到无参构造,可以看到默认的底层数组大小为10

接下来看看最常用的add方法

public boolean add(E paramE)  {    ensureCapacity(this.size + 1);    this.elementData[(this.size++)] = paramE;    return true;  }
有一段

 ensureCapacity(this.size + 1);
想一想当我们的list长度大于10时,此时size为10

 public void ensureCapacity(int paramInt)  {    this.modCount += 1;    int i = this.elementData.length;    if (paramInt > i)    {      Object[] arrayOfObject = this.elementData;      int j = i * 3 / 2 + 1;      if (j < paramInt) {        j = paramInt;      }      this.elementData = Arrays.copyOf(this.elementData, j);    }  }
这一段是用来扩容的,这也是为什么ArrayList被称为动态数组的原因

这是get方法

  public E get(int paramInt)  {    RangeCheck(paramInt);    return this.elementData[paramInt];  }

通过对ArrayList源码的解析

我们可以得出ArrayList的特点

1.有序(元素放入的先后顺序)

2.可重复

3.查找效率高


原创粉丝点击