手动实现ArrayList

创建一个MyArrayList,实现ArrayList中的几个方法    


代码片段如下:

package com.dalingjia.collection.list;

/**
 * ArrayList的简单实现(手写)
 *
 */
public class MyArrayList {

    private Object[] elementData;       //底层数组
    private int size;               //数组中元素大小

    public int size(){
        return size;
    }

    public MyArrayList() {
        this(10);
    }

    public MyArrayList(int initialCapacity){
        if(initialCapacity < 0){
            throw new IndexOutOfBoundsException();
        }
        elementData = new Object[initialCapacity];
    }

    public boolean isEmpty(){
        return size == 0;
    }

    public Object get(int index){
        rangeCheck(index);
        return elementData[index];
    }

    public boolean add(Object obj){
        //判断长度是否足够
        ensureCapacity();
        elementData[size++] = obj;
        return true;
    }

    /**
     * 添加的元素index只能<=size
     * @param index
     * @param obj
     */
    public void add(int index,Object obj){
        rangeCheckForAdd(index);
        ensureCapacity();
        System.arraycopy(elementData, index, elementData, index + 1, size - index);
        elementData[index] = obj;
        size++;

    }

    public Object remove(int index){

        rangeCheck(index);
        Object oldValue = elementData[index];
        int length = elementData.length - index -1 ;
        if(length >0){
            System.arraycopy(elementData, index+1, elementData, index, elementData.length-index-1);
        }
        elementData[size--] = null;
        return oldValue;
    }

    public boolean remove(Object obj){
        if(obj == null){
            for (int i = 0; i < size; i++) {
                if(elementData[i] == null){
                    remove(i);
                    return true;
                }
            }
        }else {
            for (int i = 0; i < size; i++) {
                if(obj.equals(elementData[i])){
                    remove(i);
                    return true;
                }
            }
        }
        return false;
    }


    //返回旧值
    public Object set(int index,Object obj){
        rangeCheck(index);
        Object oldValue = elementData[index];
        elementData[index] = obj;
        return oldValue;
    }

    public void rangeCheck(int index){
        if(index <0 || index >= size){
            throw new IndexOutOfBoundsException();
        }
    }

    private void rangeCheckForAdd(int index) {
        if (index > size || index < 0)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }

    private String outOfBoundsMsg(int index) {
        return "Index: "+index+", Size: "+size;
    }

    public void ensureCapacity(){

        //开始扩容
        if(size == elementData.length){
            Object[] newArray = new Object[size * 2 + 1];
            System.arraycopy(elementData,0, newArray, 0, elementData.length);
            elementData = newArray;
        }
    }

    public String showList(){
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < size; i++) {
            stringBuffer.append(elementData[i]);
            if(i != size-1){
                stringBuffer.append(",");
            }
        }
        return stringBuffer.toString();
    }

    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        System.out.println(myArrayList.elementData.length);//底层数组长度
        myArrayList.add("tanhq");
        myArrayList.add("jingling");
        myArrayList.add("longge");
        myArrayList.add("longge");
        myArrayList.add(1, "gege");
        System.out.println(myArrayList.isEmpty());
        System.out.println(myArrayList.get(2));
        myArrayList.remove(2);
        myArrayList.remove("gege");
        myArrayList.set(2, "jj");
        System.out.println(myArrayList.showList());
    }

}

猜你喜欢

转载自blog.csdn.net/thqtzq/article/details/84262065