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几个主要变量 先 ...
 
随机推荐
- python11day
			
昨日回顾 函数的参数: 实参角度:位置参数.关键字参数.混合参数 形参角度:位置参数.默认参数.仅限关键字参数.万能参数 形参角度参数顺序:位置参数,*args,默认参数,仅限关键字参数,**kwar ...
 - python项目中 ,open() 方法,  如何读取json文件的位置。
			
一 copy 目标文件绝对路径的URL. 固定在你电脑上的路径.简单好用.
 - 出现 error: RPC failed; curl 18 transfer closed with outstanding read data remaining 的原因
			
最近在做全栈项目,前台后台,服务器端,三端在一个文件夹,当git clone 项目的时候就会出现:error: RPC failed; curl 18 transfer closed with out ...
 - CF954H Path Counting
			
一开始的想法是枚举路径的 \(\rm LCA\) 然后再枚举两边的深度,但是这样无论如何我都只能做到 \(O(n ^ 3)\) 的复杂度. 只能考虑换一种方式计数,注意到点分治可以解决树上一类路径问题 ...
 - AT5760 Manga Market
			
首先一个想法就是可以考虑令 \(dp_{i, j}\) 表示当前考虑到了第 \(i\) 个商店,当前到了时刻 \(j\) 能走过最多的商店数量.但是你会发现这个 \(dp\) 转移的顺序并不是简单的从 ...
 - JavaScript多元运算符
			
JavaScript多元运算符 JavaScript多元运算符 **实例:**` function test(9){ var a=4,b=11; return p > 1 ? p<b ...
 - JAVA类加载器二 通过类加载器读取资源文件
			
感谢原文作者:不将就! 原文链接:https://www.cnblogs.com/byron0918/p/5770684.html 一.getResourceAsStream方法 getResourc ...
 - docker的使用 (2)
			
使用Docker 想要玩转Docker,最简单的办法就是马上用Docker创建一些自己学习和工作中需要用到的容器,下面我们带着大家一起来创建这些容器. 运行Nginx Nginx是高性能的Web服务器 ...
 - MySql索引分析及查询优化
			
B-Tree 核心特点: 多路,非二叉树 每个节点既保存索引,又保存数据 搜索时相当于二分查找 B+Tree 核心特点 多路非二叉 只有叶子节点保存数据 搜索时相当于二分查找 增加了相邻接点的指向指针 ...
 - torch.utils.data.DataLoader与迭代器转换
			
在做实验时,我们常常会使用用开源的数据集进行测试.而Pytorch中内置了许多数据集,这些数据集我们常常使用DataLoader类进行加载. 如下面这个我们使用DataLoader类加载torch.v ...