jdk1.8----ArrayList源码解析

jdk1.8----ArrayList源码解析

 

   jdk1.8----ArrayList源码解析

1.ArrayList类的结构

jdk1.8----ArrayList源码解析_第1张图片

其中,用transient关键字来修饰elementData这个数组变量,实际上表明这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。当对象被序列化时(写入字节序列到目标文件)时,transient阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。
    总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

2.ArrayList构造函数

 ArrayList构造函数分别有三个构造函数,分别是:构造一个指定初始容量的空列表、构造一个空列表和构造一个包含指定collection的元素的列表

jdk1.8----ArrayList源码解析_第2张图片

3.添加元素

  1).add(E e):在列表的末尾添加指定的元素

jdk1.8----ArrayList源码解析_第3张图片jdk1.8----ArrayList源码解析_第4张图片

其中变量modCount是在其父类AbstractList中定义的,具体如下:   

jdk1.8----ArrayList源码解析_第5张图片

具体,一个空的ArrayList新增一个元素即调用add(E e)方法,具体的实现逻辑如下:

     i)首先执行ensureCapacityInternal(size + 1),此时size值为0,所以执行ensureCapacityInternal(1)

     ii)执行ensureCapacityInternal(1),由于当前的ArrayList是空列表,所以执行 minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);取默认值DEFAULT_CAPACITY即10与参数minCapacity也就是1两者的最大值作为数组容量的预设值即10,然后执行ensureExplicitCapacity(10);

     iii)执行ensureExplicitCapacity(10),modCount自增,此时modCount值为1;由于参数大于当前数组的容量即为0,所以增加数组容量即执行grow(10);

     iv)执行grow(10),取旧容量的1.5倍即0和参数即10两者的最大值作为预设值即10,然后执行elementData = Arrays.copyOf(elementData, newCapacity);即把长度为10的空数组赋值给elementData,即空的ArrayList在新增第一个元素的时候将会把容量扩充到DEFAULT_CAPACITY即10

     v)然后执行elementData[size++] = e;此时size为0,elementData数组index为0赋值e,然后size自增  


2)add(int index, E element):将指定的元素即E element插入此列表中的指定位置即index

jdk1.8----ArrayList源码解析_第6张图片

3)addAll(Collection c) :按照特定的迭代顺序把指定集合的所有元素添加到列表的末尾

jdk1.8----ArrayList源码解析_第7张图片

 4)addAll(int index, Collection c):从指定的位置开始,将指定collection中的所有元素插入到此列表中,新元素的顺序为指定collection的迭代器所返回的元素顺序     

jdk1.8----ArrayList源码解析_第8张图片

   5)set(int index, E element):用指定的元素即E element取代在指定位置即index上的元素,并返回在指定位置即index上的旧元素

jdk1.8----ArrayList源码解析_第9张图片

4.查找元素

   1)get(int index):得到列表中指定位置即index上的元素   

jdk1.8----ArrayList源码解析_第10张图片

 2)indexOf(Object o) :返回指定元素第一次出现在列表中的位置即inde

jdk1.8----ArrayList源码解析_第11张图片

   3) lastIndexOf(Object o) :返回指定元素最后一次出现在列表中的位置即index,如果不存在指定元素,则返回-1

jdk1.8----ArrayList源码解析_第12张图片

   4.contains(Object o):返回列表是否包含指定元素

   5.删除元素

       1)remove(int index):删除列表中指定位置即index上的元素     

jdk1.8----ArrayList源码解析_第13张图片

  2)remove(Object o):删除列表中第一次出现的指定元素,如果列表中包含指定元素则返回true,反之返回false

jdk1.8----ArrayList源码解析_第14张图片

       3)clear():清空列表,将全部的元素设为null

jdk1.8----ArrayList源码解析_第15张图片

   4)removeRange(int fromIndex, int toIndex):删除list中从fromIndex(包含)到toIndex(不包含)之间所有的元素     

jdk1.8----ArrayList源码解析_第16张图片

 5)removeAll(Collection c):删除列表中存在于指定集合中的所有元素

jdk1.8----ArrayList源码解析_第17张图片

 

  6)retainAll(Collection c):删除列表中不存在于指定集合中的所有元素      

  5.其他public方法

    1)trimToSize():将list容量调整为当前list的大小即实际包含元素的个数   

jdk1.8----ArrayList源码解析_第18张图片  

2)size():返回list包含元素的个数    

    3)isEmpty():如果list不包含元素即为空,则返回true,反之返回false

4) toArray():返回一个包含list所有元素的数组

  5)iterator():返回一个按照特定顺序遍历list所有元素的迭代器  

jdk1.8----ArrayList源码解析_第19张图片

jdk1.8----ArrayList源码解析_第20张图片

你可能感兴趣的:(jdk1.8----ArrayList源码解析)