自定义java ArrayList集合



/**
 * @author xulihui
 * @date 2020/3/31 17:10
 */
public class ArrayList<E> {

    // 定义数组,用户存储集合的元素
    private Object[] elementData;

    // 定义变量,用户记录数组的个数
    private int size;

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

     //定义常量,用户默认初始化集合的容量
    private final  int  DEFAULT_CAPATITY = 10;


    public ArrayList() {
        elementData = emptyArray;
    }

    /**
     *  add 方法
      * @param e
     * @return
     */
    public boolean add(E e) {
        // 校验集合长度,是否需要扩容
        grow();
        elementData[size++] = e;
        return  true;
    }
    
    public E set(int index,E element) {
        checkIndex(index);
        E value = (E)elementData[index];

        elementData[index] = element;
        return  value;
    }

    public E remove(int  index) {
        // 检查索引
        checkIndex(index);
        E value = (E)elementData[index];
        // 计算出要移动元素的个数
        int numMoved = size -index-1;
        // 要移动的个数是否大于0
        if (numMoved > 0) {
            System.arraycopy(elementData,index+1,elementData,index,numMoved);
        }
        // 把最后位置上的元素置为null
        elementData[--size] = null;
        return value;
    }

    private void checkIndex(int index) {
        if (index < 0 || index>= size) {
          throw  new IndexOutOfBoundsException("索引越界了");
        }
    }

    // 扩容方法
     private void grow() {
        // 默认 第一次初始化
        if (elementData == emptyArray) {
            elementData = new Object[DEFAULT_CAPATITY];
        }
        // 1.5倍扩容, 如果size == 集合元素的长度,则扩容
         if(size == elementData.length) {
             //记录老数组的长度
             int oldCapacity = elementData.length;
             // 右边移动1 相当于除以2 了
             int newCapacity = oldCapacity + (oldCapacity >>1);
             // 初始化新数组的长度
             Object[] object = new Object[newCapacity];
             // 参数说明 1. 数据源 2. 从数据源的那个位置 3. 数据源的数据拷贝到哪个数组 4.从目标数据哪个位置开始 5. 数据源中有多少就拷贝多少
             System.arraycopy(elementData,0,object,0,elementData.length);
             // 把新组数的地址赋值给 elementData
             elementData = object;
         }
     }

     public E get(int index) {
        checkIndex(index);
        return (E) elementData[index];
     }

     public int getSize() {
        return  size;
     }

     public String toString() {
        if (size == 0) {
            return  "[]";
        }
        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(",");
            }
         }

         return  sb.toString();
     }
}

 



public class TestArrayList {

    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("1");
        arrayList.add("2");
        arrayList.add("3");
        arrayList.add("4");

        System.out.println(arrayList.set(0,"5"));
        System.out.println(arrayList.toString());
        System.out.println(arrayList.remove(0));
        System.out.println(arrayList.toString());

        System.out.println(arrayList.get(0));
        System.out.println(arrayList.getSize());
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潇凝子潇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值