JAVA ArrayList集合底层源码分析
ArrayList集合
一、ArrayList的注意事项

ArrayList集合可以加入null,并且可以加入多个ArrayList是由数组来实现的数据存储的ArrayList基本等同于Vetor,但是ArrayList是线程不安全的(执行效率高),在多线程下不建议使用ArrayList
二、 ArrayList 的底层操作机制源码分析(重点,难点.)
1.JDK8.0

- ArrayList中存放了一个Object类型的数组elementDate,什么类型都能往里面放
transient Object[] elementDate;transient,表示该属性不会被序列化
- 当创建
ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍 - 如果使用的是指定大小的构造器,则初始
elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。


注意:
- mount 表示的该数组的修改次数


注意:
>>1代表二进制位向右移两位,表示大小/2,这里的int newCapacity = oldCapacity + (oldCapacity >> 1),代表扩容按旧数组的1.5倍进行扩容(除第一次).newCapacity - minCapacity < 0- 第一次扩容:
newCapacity = 0,minCapacity = 10,即当最小容量比新容量小的时候,把minCpacaity赋给newCapacity,只有第一次扩容会执行这个if- 如果newCapacity 比最大的大小还要大时
- 执行hugeCapacity这个方法
- 利用
copyOf,把原数组的内容拷贝到新数组里面去,并让elementData指向该方法返回回来的地址,这样可以在保留原来数组中元素的同时,并增加新的空间,新空间默认为null;
- 第一次扩容:

若是使用指定大小的构造器

- 第一次扩容就按照elemenData的1.5倍扩容
- 整个执行流程还是和前面讲的一样
2.JDK11.0


使用ArrayList无参构造器,会创建一个只读的静态的,类型为Object的空数组
存储数据底层实现原理:

- 调用add方法,参数:
e为你要存储的数据(大概). modCount:为对该集合的操作次数,默认为0- 调用 add 方法(重载后的add方法)

- 当前元素个数 == 当前数组长度,就会进行扩容
- 之后让
elementData[s] = e,s为当前元素个数,且让size = s +1;
- 之后让
- 如果要进行扩容

- 返回一个扩容后的数组,利用
copyOf方法,把原来的数组元素,拷贝到新数组中,且新数组的长度为原来数组+1; - 然后在执行下面的赋值操作,同上
newCapacity方法

- 调用newCapacity,确定要扩大的空间
- oldCapacity 为当前数组的长度
- newCapacity 为扩容后新数组的长度:为旧数组长度的1.5倍
如果新数组的长度,比需要的(最小)容量小,则执行下面的代码
DEFAULT_CAPACITY为int 类型 ,值为10,如果elementaData 为空数组(DEFAULTCAPACTY_EMPTY_ELEMENTDATA),那么就用把mincapacity和DEFAULT_CAPACITY传进去进行比较,返回最大值,这个最大值就是要新数组的容量- 如果minCapacity<0 则抛出异常
- 并返回mincapacity
如果新数组的长度,大于需要的(最小)容量,则执行下面的代码
- 三元表达式,这里比较简单不做阐述
JAVA ArrayList集合底层源码分析的更多相关文章
- 设计模式(十七)——迭代器模式(ArrayList 集合应用源码分析)
1 看一个具体的需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系.如图: 2 传统的设计方案(类图) 3 传统的方式的问题分析 ...
- Java的LinkedList底层源码分析
首先我们先说一下,源码里可以看出此类不仅仅用双向链表实现了队列数据结构的功能,还提供了链表数据结构的功能.
- List-ArrayList集合基础增强底层源码分析
List集合基础增强底层源码分析 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 集合分为三个系列,分别为:List.set.map List系列 特点:元素有序可重复 有序指的是元素的 ...
- List-LinkedList、set集合基础增强底层源码分析
List-LinkedList 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 继上一章继续讲解,上章内容: List-ArreyLlist集合基础增强底层源码分析:https:// ...
- 你真的了解java的lambda吗?- java lambda用法与源码分析
你真的了解java的lambda吗?- java lambda用法与源码分析 转载请注明来源:cmlanche.com 用法 示例:最普遍的一个例子,执行一个线程 new Thread(() -> ...
- ArrayList详解-源码分析
ArrayList详解-源码分析 1. 概述 在平时的开发中,用到最多的集合应该就是ArrayList了,本篇文章将结合源代码来学习ArrayList. ArrayList是基于数组实现的集合列表 支 ...
- Vector总结及部分底层源码分析
Vector总结及部分底层源码分析 1. Vector继承的抽象类和实现的接口 Vector类实现的接口 List接口:里面定义了List集合的基本接口,Vector进行了实现 RandomAcces ...
- LInkedList总结及部分底层源码分析
LInkedList总结及部分底层源码分析 1. LinkedList的实现与继承关系 继承:AbstractSequentialList 抽象类 实现:List 接口 实现:Deque 接口 实现: ...
- java线程池ThreadPoolExector源码分析
java线程池ThreadPoolExector源码分析 今天研究了下ThreadPoolExector源码,大致上总结了以下几点跟大家分享下: 一.ThreadPoolExector几个主要变量 先 ...
随机推荐
- 阅读笔记——长文本匹配《Matching Article Pairs with Graphical Decomposition and Convolutions》
论文题目:Matching Article Pairs with Graphical Decomposition and Convolutions 发表情况:ACL2019 腾讯PCG小组 模型简介 ...
- plsql 视图中 为什么使用替代触发器
/* 什么是视图? 视图:数据库对象,存的是一个查询命令:当作一个虚拟的数据表来使用: 应用场景: 简化查询操作:不能直接在视图上进行create,insert,update操作: 创建视图? 需要管 ...
- Android 12(S) 图形显示系统 - createSurface的流程(五)
题外话 刚刚开始着笔写作这篇文章时,正好看电视在采访一位92岁的考古学家,在他的日记中有这样一句话,写在这里与君共勉"不要等待幸运的降临,要去努力的掌握知识".如此朴实的一句话,此 ...
- 基础学习:关于this在派生类构造函数中的理解
https://www.cnblogs.com/Bear-Study-Hard/archive/2006/01/09/313551.html 看了上面这篇文章有感,特做了个小样板,以加深对于this在 ...
- 分布式事务框架-Litx补偿事务框架源码解析
前言 之前某段时间在研究分布式事务过程中,对实现原理比较好奇,于是去Gitee上找了几个人气比较高的框架进行学习,其中印象深刻的有Litx,因为Litx源码不多,且都是基于Spring和Dubbo底层 ...
- 【转】Nginx location写法
转自:https://www.cnblogs.com/IPYQ/p/7889399.html nginx location正则写法 location = / { # 精确匹配 / ,主机名后面不能带任 ...
- docker基础——3.存储卷
把宿主机的目录或文件链接到容器的目录或文件,可以避免写时复制对高I/O操作的影响,也避免容器销毁时数据丢失. 1. 只指定容器的目录位置,-v docker run -it --name bbox1 ...
- 针对某p社游戏某整合包的研究
软件分析 垃圾re手 最近在玩群星 创意工坊里面下载了整合包 进群下载排序文件后竟然发现要付费() 28R够吃一顿好的 马上来分析一下这个软件 这是一个四版整合包的mod安装器 其中樱花远征和新星纪元 ...
- 如何写出优雅又地道的Python代码?【转载】
在Python社区文化的浇灌下,演化出了一种独特的代码风格,去指导如何正确地使用Python,这就是常说的pythonic.一般说地道(idiomatic)的python代码,就是指这份代码很pyth ...
- 07.并发编程Threads
参考文档 https://www.cnblogs.com/springsnow/p/9409205.html#_label0 1. 基础概念 1.1 进程/线程/多线程 进程(Process) 计算机 ...