欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

JAVA--自己实现ArrayList,java--arraylist

来源: javaer 分享于  点击 13531 次 点评:52

JAVA--自己实现ArrayList,java--arraylist


本次实现的ArrayList并未使用泛型,以后添加。
在自己实现ArrayList之前强烈建议先看一遍JDK的源码,有助于理解。
附上一个链接深入Java集合学习系列:ArrayList的实现原理
我自己实现了ArrayList中的add,get,set,remove方法
MyArrayList:

import java.util.Arrays;
/*
 * ArrayList的底层实现为数组
 * MyArrayList暂时不考虑泛型
 */
public class MyArrayList {
    private Object[] elementData;//存放Object的数组
    private int size;//ArrayList大小

    public MyArrayList() {
        this(10);//如果不指定大小,默认大小为10
    }
    public MyArrayList(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);//将index后的元素都后移一个位置
        elementData[index] = obj;
        size++;
    }
    private void checkCapacity(int needCapacity) {//检查ArrayList开辟的空间是否足够,如果不足则进行扩容
        if(needCapacity>elementData.length){//空间不足,扩容
            Object oldelementData[] = elementData;
            int newSize = this.size*2+1;//扩容的空间
            elementData = new Object[newSize];
            elementData = Arrays.copyOf(oldelementData, 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;//返回旧值
    }
    public Object remove(int index) {//删除index处的元素
        RangeCheck(index);
        Object oldValue = elementData[index];
        int moveNum = size-index-1;
        if(moveNum>0){
            System.arraycopy(elementData, index+1, elementData, index, moveNum);
        }   
        elementData[--size] = 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])){//obj不为null,一定要在前,否则使用elementData[i]调用equals()可能导致控制在异常
                    fastremove(i);
                    return true;
                }
            }
        }

        return false;
    }
    public 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 int length() {
        return elementData.length;
    }
}

测试:

public class TestMyArrayList {
    public static void main(String[] args) {
        MyArrayList List = new MyArrayList(5);
        //末尾插入
        List.add(new A("张三"));
        List.add(new A("李四"));
        List.add(new A("王五"));
        List.add(new A("JACK"));
        List.add(new A("张三"));
        List.add(new A("李四"));
        List.add(new A("王五"));
        List.add(new A("JACK"));
        //自选位置插入
        List.add(2,new A("TOM"));
        System.out.println(List.size());
        System.out.println(((A)List.get(8)).name);
        //将index处置为新值
        A oldA = (A)List.set(3, new A("Lucy"));
        System.out.println(oldA.name);//打印旧值
        System.out.println(((A)List.get(3)).name);//打印新值
        System.out.println(List.size());
        //将index处的元素删除
        oldA = (A)List.remove(3);
        System.out.println(oldA.name);//打印删除的元素
        System.out.println(List.size());
        //删除和指定对象匹配的元素
        A temp = new A("Lily");
        List.add(temp);
        System.out.println(List.remove(temp));
    }
}
class A{
    String name;
    public A(String name) {
        super();
        this.name = name;
    }
}

相关文章

    暂无相关文章

用户点评