仿写java中集合工具类中的ArrayList

java的数据存储离不开集合工具,集合工具有很多种,今天在这就不一一举例了,进入今天的主题:

先定义一个List的接口,定义一些仿ArrayList功能的方法

public interface List {

    Object get(int index);

    boolean add(Object obj);

    void set(Object obj,int index);

    boolean remove(int index);

    boolean isEmpty();
}

接下来
定义ArrayList实现List接口

public class ArrayList implements List{

    //核心数组 
    private Object[] obj;

    //数组再有存放数据的个数
    private int size;

    //默认的长度
    private final int DEFAULT_SIZE = 10;

    //默认数组 
    private final Object[] defaultObj = {};

    /*
     * 无参,无初始长度
     */
    public ArrayList(){
        obj = this.defaultObj;
    }

    /**
     * 有参,有初始长度
     * @param size
     */
    public ArrayList(int size){
        //数组 长度小的时候!会有过多的堆当中的创建对象!内存使用率高
        if(size < this.DEFAULT_SIZE){
            size = this.DEFAULT_SIZE;
        }
        obj = new Object[size];
    }

    /**
     * 根据集合下标取值
     */
    @Override
    public Object get(int index) {
        if(index > this.size){
            throw new ArrayIndexOutOfBoundsException("指定长度大于数组长度");
        }
        if(index < 0 ){
            throw new RuntimeException("下标必须大于零");
        }
        return this.obj[index];
    }

    /**
     * 扩展数组长度
     */
    private void exp(int index){
        this.obj = new Object[index];
    }

    /**
     * 扩充并且拷贝
     */
    private void exp2(){
        Object[] oldObj = this.obj;
        exp(this.size + (this.size >> 1));
        this.exp2(oldObj, 0, this.obj, 0, this.obj.length);
    }

    /**
     * 将未扩充之前的集合里的内容拷贝到扩充后的集合中的函数,(确保功能单一原则)
     * @param obj
     * @param star
     * @param desojb
     * @param a
     * @param b
     */
    private void exp2(Object[] obj,int star,Object[] desojb,int a,int b){
        System.arraycopy(obj, star, desojb, a, b);
    }

    /**
     * 内聚 方法
     *  第一个问题: 第一次添加  {new Arraylist(); 数组长度0 , 扩充 10  new ArrayList(10);  }
        第二个考虑:如果 满
        第三个考虑:不满
     */
    private void exp1(){
        if(this.isEmpty()){
            exp(this.DEFAULT_SIZE);//this.DEFAULT_SIZE 10
        }else{
            if(this.size == this.obj.length){
                exp2();
            }
        }
    }

    /**
     * 插入元素
     */
    @Override
    public boolean add(Object obj) {
        exp1();
        this.obj[this.size++] = obj;
        return true;
    }

    /**
     * 删除元素
     */
    @Override
    public boolean remove(int index) {

        if((index + 1) != this.size){
            this.exp2(this.obj, index + 1, this.obj, index, this.size - index);
        }

        this.obj[this.size] = null;
        this.size--;
        return true;
    }

    /**
     * 返回集合里的内容
     */
    public String toString(){
        String info = "";
        for(int i = 0 ;i < this.size;i++){
            info += this.obj[i].toString() + (i == this.size - 1? "":",");
        }
        return "["
                + info +
                "]";
    }

    /**
     * 判断集合空与否
     */
    @Override
    public boolean isEmpty() {
        return this.obj.length == 0 ? true : false;
    }

    /**
     * 修改指定集合元素的内容
     */
    @Override
    public void set(Object obj, int index) {
        if(index > this.size){
            throw new ArrayIndexOutOfBoundsException("指定长度大于数组长度");
        }
        if(index < 0 ){
            throw new RuntimeException("下标必须大于零");
        }
        this.obj[index] = obj;
    }
}

最后对以上代码进行简单测试

public static void main(String[] args) {
        List list1 = new ArrayList();
        list1.add("张三");//第0个元素
        list1.add("李四");//第1个元素
        list1.add("王五");//第2个元素
        list1.add("赵六");//第3个元素
        System.out.println("所有元素====》"+list1);
        System.out.println("判断集合里元素是否为空====》"+list1.isEmpty());
        System.out.println("获取第2个元素==》"+list1.get(1));
        //设置第3个元素的值为我不是王五了
        list1.set("我不是王五了", 2);
        System.out.println("修改后的集合元素===》"+list1);
        //删除第三个元素
        list1.remove(2);
        System.out.println("删除后的集合元素===》"+list1);
    }

测试结果:
所有元素====》[张三,李四,王五,赵六]
判断集合里元素是否为空====》false
获取第2个元素==》李四
修改后的集合元素===》[张三,李四,我不是王五了,赵六]
删除后的集合元素===》[张三,李四,赵六]


上诉代码中参有一些注解,可进行简单参考,要是存在问题以及需要优化的地方,欢迎大家提出!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值