Java—–Collection 实现的ArrayList
1.ArrayList的内部其实就是创建的数组,在增删查改里面,对数组进行操作,所以,对于增加和删除来说,数组的操作是非常麻烦的,需要要变换数字后面的数据都要改变,而且还要考虑扩容的问题,数组的索引,对于查找来说,是很方便的 通过索引可以很快速的找到需要的数据。
2.ArrayList源代码,
在创建了一个实例 的时候,就会创建一个默认的存放数据的数组elementData,然后将一个默认的空数组赋值给了他,因为版本的差异,在JDK1.5之前,创建一个新的对象,系统会给这个对象一个长度为10的数组,而在JDK1.7之后,给这个对象赋值一个空的数组。
private transient Object[] elementData;
private static final Object[] EMPTY_ELEMENTDATA = {};
public ArrayList() {
super();
this.elementData = EMPTY_ELEMENTDATA;
}
1.再进行添加操作的时候,会先判断,是不是新创建的对象,如果是新创建的一个数组,会给他一个默认的长度10,这时新的对象就创建了一个新的数组。如果不是第一次创建的对象,会先判断一下容量的大小,如果不满足条件,会进行扩容,每次扩容数组大小的1.5倍,然后在把数组copy到新的数组里面。
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
//判断 是否是新创建的对象,并且赋值给她一个默认的长度
if (elementData == EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
//如果容量不够,将进行扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//每次都增加数组的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
//把值copy 到新创建的一个数组里面。
elementData = Arrays.copyOf(elementData, newCapacity);
}
2.进行删除操作的时候,
public E remove(int index) {
//先进行范围的一个判断
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
//将要删除的值,直接覆盖,然后把最后一个数据置位null
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
3.getset操作
public E get(int index) {
//对范围的一个判断。
rangeCheck(index);
//通过索引直接找到数组里面的值,返回
return elementData(index);
}
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
//通过索引,直接将该索引的值覆盖
elementData[index] = element;
return oldValue;
}
Arraylist 源代码,底部就是一个数组,操作的还是数组。所以,没什么难的,没事多看看源码,学学算法和数据结构。引用一句话:算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了。