ArrayList 源码(基于Java1.8)
ArrayList 源码
ArrayList 基于数组实现,也就是类对变量 Object[]系列操作,封装为常用的add,remove,indexOf, contains本质是通过 size 计数器对数组进行系列的操作实现
add 方法和 toArray 也是借助 Arrays 工具类完成
还有很有意思的地方就是add的扩容方法 ensureCapacityInternal() 就会增加50%容量,
因为底层数组是不可变的,所以add实际上是通过Arrays工具再拷贝扩容后长度的数组,然后覆盖当前数组
预设集合长度是最优的操作,今天看源码才明白原理,ArrayList默认构造器为内部数组定义的长度为10,当list超出指定集合的时候,ArrayList会操作自动扩容,
扩容的方法是使用Arrays.copyOf方法重新构造新的数组,然后将旧数组的数据全部拷贝到新的数组里面,重新生成,再拷贝数组,消耗是巨大的,这也导致了 ArrayList 天生的缺点,插入删除元素慢
源码中可以看到,ArrayList继承抽象类AbstractList,实现List接口,RandomAccess, Cloneable, Serializable等接口主要用于标识,并没有很大作用
DEFAULT_CAPACITY = 10 是集合的默认初始化长度,我们常用new ArrayList<>()构造,其实就是创建一个长度为10的Object[]数组
size 为计数器,记录当前数组的长度
构造器的代码中,看下最常用的两个构造器,带参数initialCapacity的构造器,直接就让变量创建对应长度的数组,如果initialCapacity == 0 就直接赋值为空数组 Object[] elementData = {};
下面无参构造器,就直接初始化容量为10的空列表
上面的自动扩展数组容量的方法,每次添加元素都会调用该方法,确保集合的长度足够用,上面代码中最有趣的是2行
newCapacity = oldCapacity + (oldCapacity >> 1), 既每次扩大容量为当前容量的50%,这里的扩容是固定的,和HashMap有负载因子不同
然后调用 Arrays.copyOf() 将旧数组内容和新长度作为参数,创建新的Object[]数组,并且将原数组的元素,拷贝到新的数组里面
因为数组长度是不可变的,所以这里的做法是,创建新的数组,再拷贝元素,这里也是ArrayList性能最低的地方
常用的size,isEmpty,contains,indexOf 也只是对Object[] 进行系列的循环判断操作
get方法,也是指通过下标,从Object[]数组中获取对象,然后转型 Object -> E
add末尾添加元素方法步骤,先判断容量是否够用,然后在数组末尾elementData[size++] == e,加入新的元素,size为数组长度
remove 方法,也是通过循环equals匹配,找到下标,然后通过下标删除,—size,减去计数器长度,并没有实际减少数组长度
clear方法也相同,把数组的值都设为null,然后 size = 0;
总结:
通过以上对ArrayList关键部分源码分析,通晓ArrayList原理,我们可以得出结论:
- arrayList 底层来自数组,通过下标随机访问元素,速度非常快,但是插入和删除,要频繁的移动数组元素,改变数组长度,效率比较低
- arrayList 主要性能问题在于当数组元素达到容量上限,扩容的成本很大,所以能够预先知道元素,然后使用 new ArrayList(int initialCapacity) 手动设置容量是最好的
ArrayList 源码(基于Java1.8)的更多相关文章
- 死磕Java之聊聊ArrayList源码(基于JDK1.8)
工作快一年了,近期打算研究一下JDK的源码,也就因此有了死磕java系列 ArrayList 是一个数组队列,相当于动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractLis ...
- Java集合(四)--基于JDK1.8的ArrayList源码解读
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess ...
- Java -- 基于JDK1.8的ArrayList源码分析
1,前言 很久没有写博客了,很想念大家,18年都快过完了,才开始写第一篇,争取后面每周写点,权当是记录,因为最近在看JDK的Collection,而且ArrayList源码这一块也经常被面试官问道,所 ...
- java8 ArrayList源码阅读
转载自 java8 ArrayList源码阅读 本文基于jdk1.8 JavaCollection库中有三类:List,Queue,Set 其中List,有三个子实现类:ArrayList,Vecto ...
- ArrayList源码解析
ArrayList简介 ArrayList定义 1 public class ArrayList<E> extends AbstractList<E> implements L ...
- ArrayList源码剖析
ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...
- 转:【Java集合源码剖析】ArrayList源码剖析
转载请注明出处:http://blog.csdn.net/ns_code/article/details/35568011 本篇博文参加了CSDN博文大赛,如果您觉得这篇博文不错,希望您能帮我投一 ...
- ArrayList源码学习----JDK1.7
什么是ArrayList? ArrayList是存储一组数据的集合,底层也是基于数组的方式实现,实际上也是对数组元素的增删改查:它的主要特点是: 有序:(基于数组实现) 随机访问速度快:(进行随机访问 ...
- ArrayList源码分析超详细
ArrayList源码分析超详解 想要分析下源码是件好事,但是如何去进行分析呢?以我的例子来说,我进行源码分析的过程如下几步: 找到类:利用 IDEA 找到所需要分析的类(ztrl+N查找ArraLi ...
随机推荐
- POJ 3625 最小生成树 Prim C++
Building Roads Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11861 Accepted: 3376 D ...
- 编程从入门到提高,然后放弃再跑路(Java)
1.Java入门篇 1.1 基础入门和面向对象 1.1.1 编程基础 [01] Java语言的基本认识 [02] 类和对象 [03] 类的结构和创建对象 [04] 包和访问权限修饰符 [05] 利用p ...
- python实例编写(3)--对话框,多窗口,下拉框,上传文件
一.对话框: 例:点击百度的登录,弹出的小窗口 #coding=utf-8 from selenium import webdriver from time import sleep dr=webdr ...
- angular directive自定义指令
先来看一下自定义指令的写法 app.directive('', ['', function(){ // Runs during compile return { // name: '', // pri ...
- 乐橙谷浅析JAVA程序员就业前景
不知道大家对Java就业前景了解多少.随着信息化的发展,IT培训受倒了越来越多人的追捧.在开发领域,JAVA培训成为了许多人的首选!JAVA应用广泛,JAVA培训就业前景良好!目前,虽然JAVA人才的 ...
- Safe Area Layout Guide
原文:Safe Area Layout Guide Apple在iOS 7中引入了topLayoutGuide和bottomLayoutGuide作为UIViewController属性.它们允许您创 ...
- 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---简介
这一章描述如何初始化一个新线程,如何停止一个执行中的线程,以及如何了解并调整线程优先权. 读过这一章之后,你将有能力回答一个 Win32 多线程程序设计的最基本问题.你一定曾经在 Usenet ...
- 深入浅出数据结构C语言版(22)——排序决策树与桶式排序
在(17)中我们对排序算法进行了简单的分析,并得出了两个结论: 1.只进行相邻元素交换的排序算法时间复杂度为O(N2) 2.要想时间复杂度低于O(N2),算法必须进行远距离的元素交换 而今天,我们将对 ...
- 关于离线底图和离线shp文件的加载
首先底图是我自己用百度地图18级别的瓦片图在armap中制作的TPK文件,shp图层是我用同样的百度地图18级别的瓦片图矢量化的,二者在arcmap中的空间参考是一致的,所以我以为在移动端加入的时候二 ...
- 醒醒吧!互联网的真正未来不是AI,更不是VR,AR,而是区块链
这些力量并非命运,而是轨迹.他们提供的并不是我们将去向何方的预测,而是告诉我们,在不远的将来,我们会向那个方向前行,必然而然. ---凯文•凯利 文字与货币 人类在演化过程中,凭借智慧创造了无数事物, ...