Java集合之ArrayList
从源码看初始化以及增删查改,学习ArrayList。
先来看下ArrayList定义的几个属性:
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData; // 保存对象
private int size; // ArrayList的长度从这里可以看到ArrayList内部使用数组实现的。
一. 初始化
1. ArrayList()
无参的构造器:
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}可以看到这个构造器初始化了一个空数组。这里有个疑问,就是注释明明说是构造了一个长度为10的数组,其实这是在添加第一个元素的时候才进行的扩充。
2. ArrayList(int initialCapacity)
指定长度的构造器:
这个构造器显式的指明了数组的长度,其实如果小于10的话,在添加第一个元素的时候还是会扩充到长度为10的数组。
二. 增加元素
1. add(E e)
那么它是如何扩充数组长度的呢?追踪代码来到**grow(int minCapacity)**方法:
** 2. add(int index, E element)**
这里用到了System类的arraycopy方法,它的用法如下:
System. arraycopy(Object src, int srcPos, Object dest, int destPos,int length)
src:原数组;
srcPos:源数组要复制的起始位置;
dest:目标数组;
destPos:目标数组放置的起始位置;
length:复制的长度
这个方法也可以实现自身的复制。上面的就是利用了自身赋值的特性进行数组的拷贝。相当于将index后面的所有元素后移了一位,将新元素插入到index位置。
三. 删除元素
1. remove(int index)
2. remove(Object o)
四. 查找元素
五. 修改元素
总结
从源码可以看到,ArrayList以数组方式实现,查找和修改的性能比较好,增加和删除的性能就比较差了。
Last updated
Was this helpful?