程序员

我所了解的ArrayList源码

2018-02-23  本文已影响0人  奔跑之咸鱼

继承及接口


首先你要知道List类继承了Collection类,而Collection类继承了Iterator类。我觉得读源码最重要的就是找个翻译器来翻译术语,不然难看的要死。List类就是列表类,Collection类就是集合类,Iterator类就是迭代类。其中迭代类是个重头,你在各个地方都会看见。这方面的资料我也收集了,稍后会贴出来

ArrayList(数组列表类,像数组一样将元素一个一个塞进列表里,当然也用到了数组)继承了AbstractList(抽象列表类,对一些基础List操作封装),ArrayList实现了List类,RandomAccess类(这是一个标记接口,用来表明其支持快速随机访问,其实我也认为Random应翻译为任意而非随机,随机代表了不确定,任意没那么不可靠),Cloneable类(复制克隆类,具体有什么用我也不清楚,百度吧...),Serializable类(支持序列化)

ArrayList内部


ArrayList就是用数组实现的List容器,既然用数组实现,当然底层用数组来保存数据

private transient Object[] elementData; 

private int size;

可用一个Object数组来存储数据,用int来记录当前容器数据大小,transient就是让java自带默认机制进行序列化时,不需要维持。ArrayList一定使用了自定义的序列化方式

elementData是一个数据存储数组,而数组是定长的,会初始化一个容量,容量不足时再扩充容量,扩容方式为数据拷贝用int计数而不用elementData.length的原因是int计数有一个算一个,length计数会把整个数组的长度算上,造成浪费

构造方法的目的是构造一个指定容量的List,构造一个初始容量为10的List,构造一个包含指定元素的list,这些元素是按Collection的迭代器返回的顺序排列的。ArrayList不断增加,数组不断扩容,每次扩容就会开辟一块新的内存空间和数据的复制移动,在这种以写为主(写会扩容,删不会缩容)场景下,提前预知性的设置一个大容量,便可减少扩容次数,也就提高了性能

上一篇 下一篇

猜你喜欢

热点阅读