Java-----Collection 实现的ArrayList

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值