首页 > 编程语言 >ArrayList源码学习

ArrayList源码学习

时间:2022-10-09 14:58:21浏览次数:64  
标签:遍历 ArrayList 调用 List 接口 学习 源码 序列化 方法

arraylist


1、总体关系图

 

 

1.1:Serializable接口

这是一个空接口,只有实现了这个接口的对象才可以进行序列化。

然后这个序列化id是为了保证反序列化成功也就是在运行时来判断id是否一致来缺点统一版本。

 

 

transient关键字修饰的属性不会被序列化。那arraylist的元素怎么进行序列化和反序列化?

 

 

其实它重写了writeObject方法,是为了节省空间。因为arraylist会进行自动扩容,所以存放的数组永远会有空位,但是序列化没必要将空的也进行序列化。所以它将数组中不是空的位置进行了序列化。

1.2 Cloneable 接口

这也是一个空接口用来做标记用的,在进行克隆的时候会去判断有没有实现这个接口,如果没有实现 Cloneable的类对象调用clone()就会抛出CloneNotSupportedException。

1.3 RandomAccess 接口

也是一个空接口,做标记用的。用以标记实现的List集合具备快速随机访问的能力。快速随机访问就是可以随机访问List中的任何一个元素。

当一个List拥有快速访问功能时,其遍历方法采用for循环最快速。而没有快速访问功能的List,遍历的时候采用Iterator迭代器最快速。(这样我们就能在遍历之前先去判断一下,然后在决定使用什么遍历方式)

2、方法源码

2.1 构造方法

2.2 trimToSize()

目的:将动态数组中的容量调整为数组中实际容量,也是调用的Arrays的拷贝方法。

2.3 ensureCapacity()

目的:设定指定容量。为什么要有一个这个方法,为了外部调用的时候不需要关心内部modcount的改变,直接封装在这里面对modcount进行改变。我感觉也有分离职责的原因。

最后调用的是grow方法进行扩容。这里面的最大容量是Integer.MAX_VALUE - 8为了防止oom。

2.4 isEmpty()

目的:判断是否为空

2.5 contains()

目的:是否包含这个元素。

这里分出来是为了防止参数为空然后调用了equal()方法导致空指针异常

 

 

如果想返回最后一个出现的下标,那就倒着遍历数组就行了。

2.6 clone()方法

2.7 get()、set()方法

2.8 add()方法

2.9 remove()方法

2.10 clear()方法

2.11 addAll()方法

 

 

2.12 removeAll()方法

2.13 foreach()方法

eg:

2.14 replaceAll()方法

eg:输出2、3、4、5

2.15 sort()方法

 

 

标签:遍历,ArrayList,调用,List,接口,学习,源码,序列化,方法
From: https://www.cnblogs.com/thh19201420/p/16772081.html

相关文章

  • Delphi 经典游戏程序设计40例 的学习 例33 点的生存竞争
     unitR33;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,ExtCtrls,StdCtrls;typeTDotDt=r......
  • 2022-2023-1 20221415 《计算机基础与程序设计》第六周学习总结
    2022-2023-120221415《计算机基础与程序设计》第六周学习总结作业信息这个作业属于哪个课程<班级的链接>(2022-2023-1-计算机基础与程序设计)这个作业要求在哪......
  • LinkedList源码分析(二)
    ......
  • 直播平台搭建源码,css预加载旋转动画 与 流光字体
    直播平台搭建源码,css预加载旋转动画与流光字体一、预加载旋转动画Html<viewclass="concentric_round"></view>​cssbody{}.concentric_round{width:200rpx;heig......
  • 转置原理学习笔记
    正如EI所言啊,转置原理不是无中生有创造算法,而是建立了一些问题之间的转化机制。问题形式:考虑一个\(n\timesm\)的矩阵\(A\),我们有一个算法:输入长度为\(m\)的向量......
  • CPM学习
    CPM学习    CPM4与CPM5区别:      CPM5只有QDMA需要16个GTY                       TheCo......
  • 视频直播源码,插入图片、删除图片、设置图片大小、提取图片
    视频直播源码,插入图片、删除图片、设置图片大小、提取图片1.插入图片Document对象有一个add_paragraph()方法插入图片,只需要传入路径或者字节流即可,实际上它也是调用段落......
  • python的OS模块学习笔记-1
    OS模块是python和操作系统进行交互的一个接口,它提供许多操作文件及文件夹的函数。1,通过getcwd()函数获取当前文件所在路径。importospath=os.getcwd()print(path)......
  • 学习ELK的资料
     自己对日志分析挖掘处理感兴趣,然后自己在学,没有找到太好的视频,都比较零散,或者有的只是讲Elastic,对于ELK的概念,原理不是很清楚,所以自己在网上也有遇到好的文章,讲的非常清......
  • SQLCookbook 学习笔记 前言
    许多人以一种马马虎虎的态度在使用SQL,根本没有意识到自己掌握着多么强大的武器。本书的目的是打开读者的视野,看看SQL究竟能干什么。一鳞半爪从数据库中检索数据看似是一件容......