1.ArrayList是一个相对来说比较简单的数据结构,最重要的一点就是它的自动扩容,可以认为就是我们常说的“动态数组”。
来看一段简单的代码:
1 |
ArrayList<String> list = new ArrayList<String>(); |
在执行这四条语句时,是这么变化的:
其中,add
操作可以理解为直接将数组的内容置位,remove
操作可以理解为删除index为0的节点,并将后面元素移到0处。
2. add函数
当我们在ArrayList中增加元素的时候,会使用add
函数。他会将元素放到末尾。具体实现如下:
1 |
public boolean add(E e) { |
我们可以看到他的实现其实最核心的内容就是ensureCapacityInternal
。这个函数其实就是自动扩容机制的核心。我们依次来看一下他的具体实现
1 |
private void ensureCapacityInternal(int minCapacity) { |
也就是说,当增加数据的时候,如果ArrayList的大小已经不满足需求时,那么就将数组变为原长度的1.5倍,之后的操作就是把老的数组拷到新的数组里面。例如,默认的数组大小是10,也就是说当我们add
10个元素之后,再进行一次add时,就会发生自动扩容,数组长度由10变为了15具体情况如下所示:
3 set和get函数
Array的put和get函数就比较简单了,先做index检查,然后执行赋值或访问操作:
1 |
public E set(int index, E element) { |
4 remove函数
1 |
public E remove(int index) { |
注释很清楚:
Removes the element at the specified position in this list. Shifts any subsequent elements to the left (subtracts one from their indices).