简单实现ArrayList功能

前期准备

需要用到的包:诶好像没有需要手动引用的包
好吧,自己从零开始做吧。

动手实践

先把基础搭建好,创建一个类MakeArrayList。

public class MakeArrayList {

    private Object[] elementData;   //定义元素数组
    private int size;               //定义元素大小

    public int getSize(){
        return size;
    }

    /**
    *  构造器数量多余一个,必须声明默认构造器
    * */
    public MakeArrayList(){
        //默认数组长度是10
        this(10);
    }

    /**
     * 构造器重载
     * */
    public MakeArrayList(int initialCapacity){
        if(initialCapacity<0){
            try{
                throw new Exception();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        //数组开辟空间
        elementData=new Object[initialCapacity];
    }
 }

下一步就开始在类中填充东西进去,不然只有骨架没有血肉可不好看。
按功能划分:

功能1:直接添加元素

    /**
     * 实现功能-添加元素-add
     * */
    public void add(Object obj){
        //检查数组是否需要扩容
        capacityArray();
        //先保存再长度自增
        elementData[size++]=obj;
    }

传入一个对象过来,add方法接收并保存在数组中。哦忘记了,还有一个辅助功能,capacityArray(),用于检查数组是否需要扩充。

    /**
     * 数组扩容和数据复制
     * */
    public void capacityArray(){
        if(size>=elementData.length){
            //数组容量扩展为原来2倍+1
            Object[] newArray= new Object[size*2+1];
            /*
            *  功能:数组拷贝
            *  arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
            *  src:源数组
            *  srcPos:源数组copy起始位置
            *  dest:目的数组
            *  destPos:目的数组被copy的起始位置
            *  length:copy长度,一般为源数组长度
            * */
            System.arraycopy(elementData,0,newArray,0,elementData.length);
            //数组替换
            elementData=newArray;
        }
    }

也可以不用上面的arraycopy方法,自己手动循坏赋值,如下:

for(int i=0;i<elementData.length;i++){
    newArray[i]=elementData[i];
}

功能2:根据索引添加元素

    /**
     * 实现功能-添加元素:add-找到该索引位置,并将该位置元素向后移动一格,再把新元素添加到该位置
     * */
    public void add(int index,Object obj){
        //索引检查
        rangeCheck(index);
        //检查数组是否需要扩容
        capacityArray();
        //内容向后移动一位
        System.arraycopy(elementData, index, elementData, index + 1, size - index);
        //插入元素
        elementData[index]=obj;
        size++;
    }

这里又需要添加一个辅助功能,rangeCheck(index),判断索引是否超出数组大小或者索引非法,如下:

    /**
     * 索引检查
     * */
    private void rangeCheck(int index){
        if(index<0||index>=size){
            try{
                throw new Exception();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

功能3:根据索引替换元素

    /**
     * 实现功能-添加元素:set-在索引位置处替换
     * */
    public Object set(int index,Object obj){
        //检查索引是否符合
        rangeCheck(index);
        //获取原位置对象
        Object oldValue=elementData[index];
        //替换
        elementData[index]=obj;
        //将原位置的对象返回
        return oldValue;
    }

功能4:是否为空判断

    /**
     * 实现功能-isEmpty判断
     * */
    public boolean isEmpty(){
        //返回true或者false
        return size==0;
    }

功能5:取出数据

    /**
     * 实现功能-取出内容
     * */
    public Object get(int index){
        //索引检查
        rangeCheck(index);
        //根据索引返回内容
        return elementData[index];
    }

功能6:删除记录

    /**
     * 实现功能-删除元素:内容移除
     * */
    public void fastRemove(int index){
        //判断索引是否正确
        rangeCheck(index);
        //根据索引获取之后元素长度
        int numMoved=size-index-1;
        if(numMoved>0){
            //数组内容向前移动一位
            System.arraycopy(elementData,index+1,elementData,index,numMoved);
            //原数组最后一位变为null
            elementData[--size]=null;
        }
    }
    /**
     * 实现功能-删除元素:获取对象,查找判断
     * */
    public void remove(Object obj){
        for(int i=0;i<size;i++){
            if(get(i).equals(obj)){
                //调用实际删除操作
                fastRemove(i);
            }
        }
    }

执行删除操作时,首先调用remove(Object object)获取对象,再for循环遍历,有符合条件时进行移除。

测试

创建一个测试类

class Test{
    /**
     * 测试功能
     * */
    public static void main(String args[]) {
       MakeArrayList list=new MakeArrayList();
    }
}

在main中添加测试代码。
测试一:直接添加元素

        /*
        * 测试一
        *     直接添加元素
        * */
        System.out.println("测试一:直接添加元素");
       list.add("firstTest");   //添加字符串'
       list.add(new Date());   //添加时间
       list.add(1234);         //添加常量,自动封装Integer
       System.out.println("数组长度:"+list.getSize());
       System.out.println("数组是否为空:"+list.isEmpty());
       for(int i=0;i<list.getSize();i++){
           System.out.println("数组内容"+i+":"+list.get(i));
       }

结果:
这里写图片描述

测试二:根据索引添加元素

        /*
        * 测试二
        *     根据索引添加元素
        * */
        System.out.println("测试二:add-根据索引添加元素");
        for(int i=0;i<list.getSize();i++){
            System.out.println("原数组内容"+i+":"+list.get(i));
        }
        list.add(1,"secondTest");
        for(int i=0;i<list.getSize();i++){
            System.out.println("添加后,新数组内容"+i+":"+list.get(i));
        }

结果:
这里写图片描述

测试三:根据索引替换元素

        /*
        * 测试三
        *     根据索引替换元素
        * */
        System.out.println("测试三:set-根据索引替换元素");
        for(int i=0;i<list.getSize();i++){
            System.out.println("原数组内容"+i+":"+list.get(i));
        }
        list.set(1,"thirdTest");
        for(int i=0;i<list.getSize();i++){
            System.out.println("替换后,数组内容"+i+":"+list.get(i));
        }

结果:
这里写图片描述

测试四:删除元素

        /*
        * 测试四
        *     删除元素
        * */
        System.out.println("测试四:删除元素");
        list.add("lisi");
        list.add("wangwu");
        System.out.println(list.getSize());
        for(int i=0;i<list.getSize();i++){
            System.out.println("原数组内容"+i+":"+list.get(i));
        }
        list.remove("lisi");
        for(int i=0;i<list.getSize();i++){
            System.out.println("删除后,数组内容"+i+":"+list.get(i));
        }

结果:
这里写图片描述

OK!到此已经完成了功能的实现,如果想不出原理,可以查看ArrayList原版是整么实现的,eclipse和IDEA都有提示,Ctrl+目标快捷键查看。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值