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代码:
- public ArrayList(){
- 这(10 )
- }
- public ArrayList(int initialCapacity){
- super ();
- if (initialCapacity < 0 )
- 抛出新的 IllegalArgumentException(“Illegal Capacity:” + initialCapacity);
- 这个.elementData = new Object [initialCapacity];
- }
- public ArrayList(Collection <? extends E> c){
- elementData = c.toArray();
- size = elementData.length;
- // c.toArray可能(不正确)不返回Object [](见6260652)
- if (elementData.getClass()!= Object [] 。class )
- elementData = Arrays.copyOf(elementData,size,Object [] .class );
- }
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中存储元素的代码中,我们看到,每当向数组中添加元素时,都要去检查添加后元素的个数是否会超出当前数组的长度,如果超出,数组将会进行扩容,以满足添加数据的需求。
ArrayList底层实现原理的更多相关文章
- ArrayList 底层实现原理
ArrayList的底层实现原理 1, 属性:private static final int DEFAULT_CAPACITY = 10; private static final Object [ ...
- ArrayList的底层实现原理
ArrayList源码分析 1.java.util.ArrayList<E> : List 接口的大小可变数组的实现类 ArrayList 内部基于 数组 存储 各个元素. 所谓大小可变数 ...
- ArrayList底层原理
ArrayList底层采用数组实现,访问特别快,它可以根据索引下标快速找到元素.但添加插入删除等写操作效率低,因为涉及到内存数据复制转移. ArrayList对象初始化时,无参数构造器默认容量为10, ...
- Java集合:ArrayList的实现原理
Java集合---ArrayList的实现原理 目录: 一. ArrayList概述 二. ArrayList的实现 1) 私有属性 2) 构造方法 3) 元素存储 4) 元素读取 5) 元素删除 ...
- 简单复习一下ArrayList的扩容原理
刚刚跟几个好朋友喝完小酒回家,简单大概复习一下ArrayList的扩容原理,由于头有点小晕,就只大概说一下扩容的原理哈: 首先ArrayList实现了List接口,继承了AbstractList,大家 ...
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别(转)
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别 文章来源:http://www.cnblogs.com/beatIteWeNerverGiveU ...
- ArrayList使用及原理
之前面试时,经常被问到ArrayList的原理,今天整理了一些ArrayList的使用原理和必问的知识点. ArrayList的继承关系 定义一个ArrayList的方法 ArrayList的三个构造 ...
- PHP底层工作原理
最近搭建服务器,突然感觉lamp之间到底是怎么工作的,或者是怎么联系起来?平时只是写程序,重来没有思考过他们之间的工作原理: PHP底层工作原理 图1 php结构 从图上可以看出,php从下到上是一个 ...
- ArrayList/Vector的原理、线程安全和迭代Fail-Fast
疑问 * ArrayList是非线程非安全的,具体是指什么?具体会产生什么问题?* ArrayList的内部原理是什么?为什么可以动态扩容?* Vector是线程安全的,具体是如何实现的?为什么不再推 ...
随机推荐
- Java温故而知新-空心菱形
空心菱形 今天做题练手,题目是空心菱形,一开始没什么思路,去网上找了找,发现很难找到讲的通透的,自己现在独立做出来了,记录一下,以备后用. * * * * * * * * * * * * * * * ...
- SSH:dataSource配置问题
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...
- java选择排序详解
排序算法--选择排序 public class Selector implements ISortAble{ @Override public void sort(int[] a) { int n=a ...
- C#输出杨辉三角形
话不多说直接上代码: class Program { static void Main(string[] args) { ;//杨辉三角形的长度 Console.Write("输入杨辉三角长 ...
- linux环境下安装nginx步骤
开始前,请确认gcc g++开发类库是否装好,默认已经安装. ububtu平台编译环境可以使用以下指令 apt-get install build-essential apt-get install ...
- [转]Java7中的ForkJoin并发框架初探(上)——需求背景和设计原理
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp83 这篇我们来简要了解一下JavaSE7中提供的一个新特性 -- For ...
- python-分页代码
page.py ''' django内使用方式: all_count = models.UserInfo.objects.all().count() # path_info 当前页的url # all ...
- shell下office、html、pdf文档互转方法
分类: 后台开发 版权声明:本文为博主原创文章,未经博主允许不得转载. OFFICE 文档在线预览方案很多: 服务器先转换为PDF,再转换为SWF,最后通过网页加载Flash预览,比如flexp ...
- [转载]Python实现浏览器自动化操作
原文地址:Python实现浏览器自动化操作作者:rayment 最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是支持IE,而且项目也较久没 ...
- 转: 【Java并发编程】之五:volatile变量修饰符—意料之外的问题(含代码)
转载请注明出处: volatile用处说明 在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而随着JVM的成熟和优化,现在在多线程 ...