简单实现ArrayList功能

来源:互联网 发布:一年php工资7千 编辑:程序博客网 时间:2024/06/05 15:20

前期准备

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

动手实践

先把基础搭建好,创建一个类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+目标快捷键查看。

原创粉丝点击