源码阅读:简单实现ArrayList中的主要方法

来源:互联网 发布:粒子滤波算法原理 编辑:程序博客网 时间:2024/06/01 09:10

ArrayList就是传说中的动态数组,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素、灵活的设置数组的大小

  • 两个字段:数组容器与元素的个数size
   /**     * 字段:数组作为容器,与尺寸     */    Object[] elementData;    int size;//区分数组中的属性length(容器的容量)
  • 构造方法:(指定元素数组初始化容量 + 一个默认的10个容量大小)
    public ArrayListImpl(int initialSize){        if (initialSize < 0){            throw new IllegalArgumentException("LIst容量不够");        }        this.elementData =new Object[initialSize];    }    public ArrayListImpl(){        this(10);//默认调用容量为10的构造方法    }
  • 添加元素:之前需要检查容量,调用ensureCapacity,如果不够的话容量大小应该增加
   public boolean add(Object element){        ensureCapacity(size + 1);//至少扩充容量的1个        elementData[size++] = element;        return true;    }    /**     * 确定容量:取max(指定的值minCapacity,1.5倍原来容量+1);并重新赋值     */    public void ensureCapacity(int minCapacity){//默认是为  size + 1:size指的是其中数据个数        int oldCapacity = elementData.length;//数组的长度        if (oldCapacity < minCapacity){//原来的空间不够了            int newlength = (oldCapacity * 3)/2 + 1;            int newCapacity = Math.max(minCapacity,newlength);            elementData = Arrays.copyOf(elementData,newCapacity);//复制数组        }    }
  • 指定index进行添加:[ index,后面的 ] 往后移动一个
 public boolean add(int index, Object element){        if (index < 0 || index > size ){//如果为空或者已经越界了就抛出异常            throw new ArrayIndexOutOfBoundsException("数组索引错误index:"+ index);        }        ensureCapacity(size);        System.arraycopy(elementData, index, elementData, index + 1,                size - index);//往后偏移一个        elementData[index] = element;        size++;        return true;    }
  • 获取指定的元素:之前需要检查index时候越界
/**     * 获取元素之前需要检查是否越界等     */    public Object get(int index){        rangeCheck(index);        return elementData[index];    }    public void rangeCheck(int index){        if (index > size){            throw new ArrayIndexOutOfBoundsException("您查找的元素越界了");        }    }
  • 删除元素:把当前到最后的元素进行往前移动一位,并删除让垃圾回收进行回收
 public Object remove(int index){        rangeCheck(index);        Object oldElement = elementData[index];//临时保存起来        int numMoved = size - index - 1;//长度        if (numMoved > 0){            System.arraycopy(elementData,index+1,elementData,index,numMoved);        }        elementData[--size] =null;//垃圾回收机制开始工作        return oldElement;    }
0 0
原创粉丝点击