ArrayList底层实现原理

ArrayList概述:

   ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,并允许包括null在内的所有元素。除了实现列表接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。每个ArrayList的实例都有一个容量,该容量是指用来存储列表元素的数组的大小。随着向ArrayList中中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造的ArrayList时指定其容量。在添加大量元素前,应用程序也可以使用的ensureCapacity操作来增加ArrayList的实例的容量,这可以减少递增式再分配的数量。

 

Arraylist 实现了list接口,底层是使用数组存放数据,实际上操作就是对数组的操作。

ArrayList实现:

1)数组实现

    private transient  Object [] elementData;   

 2)构造方法:(3种实现方式)

    1)构造默认的初始化容量列表;

    2)构造一个指定的初始化容量的空列表;

    3)构造一个包含指定collection的元素的列表,这些元素按照collection的迭代器,返回他们的顺序排列的;

  Java代码:

  1. public  ArrayList(){  
  2.     10 )  
  3. }  
  4.   
  5. public  ArrayList(int  initialCapacity){  
  6.     super ();  
  7.     if  (initialCapacity <  )  
  8.         抛出新的 IllegalArgumentException(“Illegal Capacity:” + initialCapacity);   
  9.     这个.elementData =  new  Object [initialCapacity];  
  10. }  
  11.   
  12. public  ArrayList(Collection <?  extends  E> c){  
  13.     elementData = c.toArray();  
  14.     size = elementData.length;  
  15.     // c.toArray可能(不正确)不返回Object [](见6260652)  
  16.     if  (elementData.getClass()!= Object [] 。class )  
  17.         elementData = Arrays.copyOf(elementData,size,Object [] .class );  
  18. }  

  3)存储:

  @Override

  public boolean add(Object obj) {
  exp1();
  this.obj[this.size++] = obj;
  return true;
  }

4)删除:

  @Override

  public boolean remove(int index) {

  if((index + 1) != this.size){
  this.exp2(this.obj, index + 1, this.obj, index, this.size - index);
  }

  this.obj[this.size] = null;
  this.size--;
  return true;
  }

5)制空:

  

  @Override
  public boolean isEmpty() {
  return this.obj.length == 0 ? true : false;
  }

 6)调整 
   数组容量:从上面介绍的向ArrayList中存储元素的代码中,我们看到,每当向数组中添加元素时,都要去检查添加后元素的个数是否会超出当前数组的长度,如果超出,数组将会进行扩容,以满足添加数据的需求。

 

posted @ 2017-09-25 15:45  tcam  阅读(1609)  评论(0编辑  收藏  举报