博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArrayList底层实现原理
阅读量:7038 次
发布时间:2019-06-28

本文共 1616 字,大约阅读时间需要 5 分钟。

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

 

转载于:https://www.cnblogs.com/tcam/p/7592164.html

你可能感兴趣的文章
[转]Android Studio创建Xposed模块项目时BridgeApi的正确添加方式
查看>>
【hive】——Hive sql语法详解
查看>>
python 全栈开发,Day50(Javascript简介,第一个JavaScript代码,数据类型,运算符,数据类型转换,流程控制,百度换肤,显示隐藏)...
查看>>
一篇网络流的好blog
查看>>
Python基础之继承与派生
查看>>
filter、map、every函数的使用
查看>>
黑马程序员——iOS学习——UITableView表视图单元样式
查看>>
Bash基础——减号-
查看>>
Android适配文件dimen自动生成代码
查看>>
走马观花--快餐学python笔记
查看>>
jquery轻量级富文本编辑器Trumbowyg
查看>>
(二十八)static关键字
查看>>
vue条件渲染
查看>>
转 MySQL数据库基础
查看>>
ubuntu 解压命令全部
查看>>
Chrome教程(一)NetWork面板分析网络请求
查看>>
第十八回  基础才是重中之重~开发人员应学会用throw
查看>>
Rosenblatt's perceptron
查看>>
1570:基础练习 分解质因数
查看>>
判断ie浏览器7、8、9三个版本
查看>>