ArrayList源码分析
顺序表
ArrayList分析
-
底层是数组实现的,但是长度是可以变话的,元素是Object类型的
-
Arrays.copyOf();产生的是一个新的数组。
-
数组的元素个数是length;
-
Array List元素个数是size();因为底层是数组扩容实现的,扩容的长度是按公式固定增长的。
-
List 接口
public interface List { public int size(); public Object get(int i); public void add(Object e); public boolean isEmpty(); public void add(int i,Object e); }
-
ArrayList实现类
public class ArrayList implements List{ private Object[] elementData;//没有确定长度的Object类型的数组 private int size;//不是数组分配的长度,而是元素的个数 //构造方法(initalCapacity:初始长度) public ArrayList(int initalCapacity){ elementData = new Object[initalCapacity];//给数组分配指定数量的空间 size = 0; //数组的默认个数是0 } public ArrayList(){ this(4);//没有指定长度,默认长度是4 // elementData = new Object[]{};//没有指定长度,长度是0 } public void add(int i,Object e){ //如果数组的元素个数和数组的长度相等了,需要扩容。 if(i<0 ||i>size){ throw new MyArrayIndexOutofBoundsException("数组索引越界异常:"+i); } if(size==elementData.length) { grow(); } //添加了元素以后,后面的元素后移 for(int j=size;j>i;j--){ elementData[j] = elementData[j-1]; } //添加元素 elementData[i] = e; //元素个数++ size++; } public void add(Object e){ this.add(size,e);//添加到最后索引的位置 } private void grow(){ // Object[] newArr = new Object[elementData.length*2]; // for(int i=0;i<size;i++){ // newArr[i] = elementData[i]; // } // elementData = newArr; elementData = Arrays.copyOf(elementData,elementData.length*2); } public int size(){ return size; } public boolean isEmpty(){ return size==0; } public Object get(int i){ if(i<0 || i>=size){ throw new MyArrayIndexOutofBoundsException("数组越界异常!"); } return elementData[i]; } public String toString(){ if(size==0){ return "[]"; } StringBuilder builder = new StringBuilder("["); for(int i=0;i<size;i++){ if(i==size-1) { builder.append(elementData[i]); }else{ builder.append(elementData[i]+","); } } builder.append("]"); return builder.toString(); } }