ArrayList源码分析四

 接下来我们来自定义一个ArrayList

package com.example.suanfademo;

public class MyArrayList<E> {
    //定义数组,用于存储集合的元素
    private Object[] elementData;

    //定义变量,用于记录数组的大小
    private int size;

    //定义空数组,用于在创建集合对象的时候给elementData初始化
    private Object[] emptyArray = {};

    //定义常量,用于记录集合的容量
    private final int DEFAULT_CAPACITY = 10;

    public MyArrayList() {
        //给elementData初始化
        elementData = emptyArray;
    }

    /**
     * 添加
     */
    public boolean add(E e) {
        //校验是否需要扩容
        ensureCapacityInternal();
        //将元素添加到集合
        elementData[size++] = e;
        return true;
    }

    /**
     * 修改
     */
    public E set(int index, E element) {
        if (index >= size)
            throw new IndexOutOfBoundsException("索引越界了!");
        //把index对应的元素取出,将来好返回
        E oldValue = (E) elementData[index];
        //替换元素
        elementData[index] = element;
        return oldValue;
    }

    /**
     * 删除方法
     * 需要移动元素
     */
    public E remove(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException("索引越界了!");

        //取出元素,将来好返回
        E oldValue = (E) elementData[index];
        //计算出要移动元素的个数
        int numMoved = size - index - 1;
        //判断移动元素的个数是否大于0
        //如果我们要移动的元素是1,那么我们需要移动1后面的元素,
        if (numMoved > 0)
            System.arraycopy(elementData, index + 1, elementData, index, numMoved);
        //最后的元素是无效的
        elementData[--size] = null;
        return oldValue;
    }

    /**
     * 获取元素
     */
    public E get(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException("索引越界了!");
        return (E) elementData[index];
    }

    public String toString() {
        //对集合进行判断,如果没有元素就返回“[]”
        if (size == 0) {
            return "[]";
        }

        //创建StringBuilder
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < size; i++) {
            if (i == size - 1) {
                sb.append(elementData[i]).append("]");
            } else {
                sb.append(elementData[i]).append(",").append(" ");
            }
        }
        return sb.toString();
    }


    /**
     * 扩容
     */
    private void ensureCapacityInternal() {
        //集合存储元素的数组是否是空数组
        if (elementData == emptyArray ) {
            //如果是空数组,第一次扩容
            elementData = new Object[DEFAULT_CAPACITY];
        }
        //核心算法
        //size的长度是5,那么集合元素数组的长度是10,那么size == 集合元素数组的长度就扩容
        if (size == elementData.length) {
            //先定义变量记录老容量
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            Object[] obj = new Object[newCapacity];
            //拷贝元素到新数组当中
            System.arraycopy(elementData, 0, obj, 0, elementData.length);
            //把新数组的地址赋值给elementData
            elementData = obj;
        }
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值