【Java】ArrayList 底层原理,自己实现ArrayList

实现的功能有 

  • elementData对象数组用来存放对象
  • size 计算容器大小
  • ArrayList空构造器,带初始大小的构造器
  • ensureCapacity进行对象数组扩容
  • rangeCheck进行检查输入值是否在范围内
  • get方法返回某一位置对象
  • set方法修改某一位置对象
  • add方法在结尾增加对象,在指定位置增加对象
  • remove删除制定位置对象,删除与传参对象相同的对象
import java.util.ArrayList;
import java.util.List;

/**
 * 自己实现一个arraylist,学习底层实现与结构
 * @author 袁盛桐
 */
 public class MyArrayList{
    /**
     * 对象数组
     */
    private Object[] elementData;
    
    /**
     * 容器大小
     */
    private int size;

    /**
     * 返回elementData的size
     */
    public int size(){
        return this.size;
    }

    /**
     * 空构造器,初始长度为10
     */
    public MyArrayList(){
        this(10);
    }

    /**
     * initialCapacity是初始容器长度
     */
    public MyArrayList(int initialCapacity){
        if(initialCapacity < 0){
            try {
                throw new Exception();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        elementData = new Object[initialCapacity];
    }

    /**
     * 数组扩容
     */
    private void ensureCapacity(){
        if(size == elementData.length){
            //扩容操作
            Object[] newArray = new Object[size*2+1];
            //从老数组elementData数组的0位置拷贝到新数组newArray的0位置,拷贝长度为elementData.length
            System.arraycopy(elementData,0,newArray,0,elementData.length);
            elementData = newArray;
        }
    }

    /**
     * 检查输入的index是否在范围内
     */
    public void rangeCheck(int index){
        if(index<0||index>=size){
            try {
                throw new Exception();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 返回某一位置对象
     */
    public Object get(int index){
        rangeCheck(index);
        return elementData[index];
    }

    /**
     * 修改对象
     */
    public Object set(int index, Object obj){
        rangeCheck(index);
        Object oldValue = elementData[index];
        elementData[index] = obj;
        return oldValue;
    }

    /**
     * add方法,增加对象
     */
    public void add(Object obj){
        //数组扩容
        ensureCapacity();
        //先赋值后自增
        elementData[size++] = obj;
    }

    /**
     * 在指定位置增加对象
     */
    public void add(int index, Object obj){
        rangeCheck(index);
        //数组扩容
        ensureCapacity();
        System.arraycopy(elementData,index,elementData,index+1,size-index);
        elementData[index] = obj;
        size++;
    }

    /**
     * 删除指定位置对象
     * nummoved是判断制定元素是否在中间,如果在中间nummoved是要后面元素提前的数量
     * 把最后一个元素设为null
     */
    public void remove(int index){
        rangeCheck(index);
        int numMoved = size - index - 1;
        if(numMoved > 0){
            System.arraycopy(elementData,index+1,elementData,index,numMoved);
        }
        elementData[--size] = null;
    }

    /**
     * 删除与obj相同的对象
     */
    public void remove(Object obj){
        for(int i=0;i<size;i++){
            if(get(i).equals(obj)){
                remove(i);
            }
        }
    }

    
 }

猜你喜欢

转载自blog.csdn.net/weixin_38516944/article/details/81298402