• 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中存储元素的代码中,我们看到,每当向数组中添加元素时,都要去检查添加后元素的个数是否会超出当前数组的长度,如果超出,数组将会进行扩容,以满足添加数据的需求。

  • 相关阅读:
    Can't use Subversion command line client: svn
    SpringMVC配置easyui-datagrid
    找不到提交和更新按钮,subversion不见了,无法更新和上传代码
    静态资源[org.springframework.web.servlet.PageNotFound]
    Field 'id' doesn't have a default value
    MySql 插入数据中文乱码
    Junit 测试 Spring
    mybatis动态SQL
    Mybatis 3.3.0 Log4j配置
    MappingJacksonHttpMessageConverter过期
  • 原文地址:https://www.cnblogs.com/tcam/p/7592164.html
Copyright © 2020-2023  润新知