手写ArrayList的实现

一.引言java

众所周知ArrayList是一种数组的实现方式,也就说明其有序有下标不愿重复,查询快增删慢的特色,今天有时间就研究了一下其实现方法并手写了一些,实现原理草考如下连接
实现原理web

二.demo实践数组

1.首先建立一个NewList接口ide

package org.ligh.arraylist;
/**
 * Created by ${ligh} on 2019/2/15 上午9:22
 */
public interface NewList<E> {

    public void add(E object);

    public void add(int index,E object);

    public boolean remove(E object);

    public Object remove(int index);

    public int getSize();

    public Object get(int index);

    public void update(int index,Object obj);
}

2.建立一个NewArrayList实现类,开始具体写demosvg

package org.ligh.arraylist;
import java.util.Arrays;
/**
 * Created by ${ligh} on 2019/2/15 上午9:26
 */
public class NewArrayList<E> implements NewList<E> {

    //定义属性
    private transient Object[] elementData;
    //arrayList实际数量
    private int size;

    protected transient int modCount = 0;

    public NewArrayList() {
        this(10);
    }

    public NewArrayList(int initialCapacity) {
       if (initialCapacity<0)
                throw new IllegalArgumentException("Illegal Capacity " +initialCapacity);
       elementData = new Object[initialCapacity];
    }

    /**
     *  扩容操做
     *
     * @param minCapacity
     */
    public void ensureExplicitCapacity(int minCapacity){
        if(minCapacity == size){
            //获取原来的长度
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            if(newCapacity<minCapacity){
                newCapacity = minCapacity;
            }
            //把原来的元素赋值到新的数组长度内存中
            elementData = Arrays.copyOf(elementData,newCapacity);
        }
    }

    /**
     *  判断是否下标越界
     *
     * @param index
     */
    public void rangCheck(int index){
        if(index >= size){
            throw new IndexOutOfBoundsException("length--->" +index);
        }
    }

    /**
     * 添加操做
     *
     * @param object
     */
    @Override
    public void add(E object) {
        //判断是否须要扩容
       ensureExplicitCapacity(size+1);
       elementData[size++] = object;
    }

    @Override
    public void add(int index, E object) {
        //判断是否下标越界
        rangCheck(index);
        //判断是否须要扩容
        ensureExplicitCapacity(size+1);
        System.arraycopy(elementData,index,elementData,index+1,size);
        elementData[index] = object;
        size++;
    }

    /**
     * 删除操做
     *
     * @param object
     * @return
     */
    @Override
    public boolean remove(E object) {
            for (int index=0;index<size;index++){
                if(elementData[index] .equals(object)){
                    remove(index);
                    return true;
                }
            }
        return false;
    }
    /**
     * 根据下标删除
     *
     * @param index
     * @return
     */
    @Override
    public Object remove(int index) {
        rangCheck(index);
        Object o = get(index);
        int numMoved = elementData.length - 1 - index;
        if(numMoved>0){
            System.arraycopy(elementData,index+1,elementData,index,numMoved);
        }
        elementData[--size] = null;
        return o;
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public Object get(int index) {
        rangCheck(index);
        return elementData[index];
    }

    /**
     * 根据下标更新数据
     *
     * @param index
     * @param obj
     */
    @Override
    public void update(int index, Object obj) {
        rangCheck(index);
        //先删除须要更新的对象
        remove(index);
        E e = (E) obj;
        add(index,e);
    }
}

3.测试测试

package org.ligh.arraylist;
/**
 * Created by ${ligh} on 2019/2/15 上午10:02
 */
public class TestEasyArrayList {
    public static void main(String[] args) {
    
        NewList<Object> list = new NewArrayList<>();

        System.out.println("=====添加操做====");
        list.add("李国辉");
        list.add("沈庆华");
        list.add("小猪猪");
        list.add("小笨猪");

        for (int i =0;i<list.getSize();i++){
            System.out.println(i+"<---->"+list.get(i));
        }

        System.out.println("=====更新操做=====");
        int size1 = list.getSize();
        System.out.println("集合长度: "+size1);
        list.update(2,"新年好!");
        for (int i =0;i<list.getSize();i++){
            System.out.println(i+"<---->"+list.get(i));
        }

        System.out.println("=====删除操做====");
        list.remove(3);
        for (int i =0;i<list.getSize();i++){
            System.out.println(i+"<---->"+list.get(i));
        }

        System.out.println("=====查询操做====");
        int size = list.getSize();
        String o = list.get(2).toString();
        System.out.println("数组长度:"+size+"获取的值: "+o);
    }
}

至此就完成了手下ArrayList的实现,其中最须要注意的就是下标的变化,另一定要注意集合数组的空间初始化必定要有。this