Java-----Collection 实现的ArrayList

来源:互联网 发布:冒险岛数据库中心 编辑:程序博客网 时间:2024/06/04 00:44

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 源代码,底部就是一个数组,操作的还是数组。所以,没什么难的,没事多看看源码,学学算法和数据结构。引用一句话:算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了。

0 0
原创粉丝点击