基础——重新实现ArrayList集合框架

/**
 * Created by eason on 2018/11/19.
 */

import java.util.Arrays;

/**
 * 先不使用泛型
 */
public class SimpleList {
    private Object[] elementData;
    private int size;

    public SimpleList(){

    }
    public SimpleList(int initSize){
        if (initSize < 0){//参数不合法,抛出异常
            throw new IllegalArgumentException("IllegalArgument:" + initSize);
        }
        elementData = new Object[initSize];
    }

    //添加
    public void add(Object obj){
        checkCapacity(size + 1);//插入一个元素,检查一下数组是否存在size+1大小的空间。
        elementData[this.size++] = obj;//在数组的末尾添加该元素
    }

    public void add(int index, Object obj){//在index位置插入元素obj
        RangeCheck(index);
        checkCapacity(size + 1);//插入一个元素,至少需要size+1大小的空间
        System.arraycopy(elementData, index, elementData, index+1, size - index);
        elementData[index] = obj;
        size++;
    }
    private void checkCapacity(int needCapacity){//检查ArrayList开辟的空间是否足够,如果不足则进行扩容
        if (needCapacity > elementData.length){
            Object oldElement[] = elementData;
            int newSize = this.size * 2 + 1;//扩容后空间
            elementData = new Object[newSize];
            elementData = Arrays.copyOf(oldElement, newSize);
        }
    }
    private void RangeCheck(int index){//检查索引是否合法
        if (index < 0 || index >= size){
            throw new IndexOutOfBoundsException("IllegalArgument" + index);//数组越界,抛出异常
        }
    }
    //查询
    public Object get(int index){//根据索引返回对象
        RangeCheck(index);
        return elementData[index];
    }
    //修改
    public Object set(int index, Object obj){//将index位置设置为obj
        RangeCheck(index);
        Object oldValue = elementData[index];
        elementData[index] = obj;//设置新值
        return oldValue;//?set方法不是应该返回void吗
    }
    //删除
    public Object remove(int index){//删除index处的元素
        RangeCheck(index);
        Object oldValue = elementData[index];
        int moveNum = size - index - 1;
        if (moveNum > 0){//直接覆盖了index位置上的对象
            System.arraycopy(elementData, index + 1, elementData, index, moveNum);
        }
        elementData[--size] = null;//让垃圾回收器回收, 数组上的最后一个对象置位null
        return oldValue;
    }

    public boolean remove(Object obj){//删除等于obj的元素, 成功返回true, 失败返回false
        if (obj == null){
            for (int i = 0; i < size; i++) {
                if (elementData[i] == null){
                    fastremove(i);
                    return true;
                }
            }
        }else {
            for (int i = 0; i < size; i++) {
                if (obj.equals(elementData[i])){
                    fastremove(i);
                    return true;
                }
            }
        }
        return false;
    }

    private void fastremove(int index){
        int moveNum = size - index - 1;
        if (moveNum > 0){
            System.arraycopy(elementData, index + 1, elementData, index, moveNum);
        }
        elementData[--size] = null;
    }


    public int size(){
        return this.size;
    }

    public boolean isEmpty(){
        return  false;
    }

    public static void main(String[] args) {
        SimpleList simpleList = new SimpleList(5);
        //末尾插入
        simpleList.add(new A("AAA"));
        simpleList.add(new A("BBB"));
        simpleList.add(new A("CCC"));
        simpleList.add(new A("DDD"));
        simpleList.add(new A("EEE"));
        //在index为3的位置插入XXX
        simpleList.add(3, new A("XXX"));
//        simpleList.add(8, new A("YYY"));
        System.out.println(((A)simpleList.get(3)).name);

    }
}

class A{
    String name;
    public A(String name){
        super();
        this.name = name;
    }

}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值