目录
ArrayList JDK1.7 版本底层扩容机制 实现源码解读:
ps:JDK1.7的ArrayList 的 ArrayList(Collection c) 构造器 源码解读:
ArrayList JDK1.8 版本底层扩容机制 实现源码解读:
ps:JDK1.8的ArrayList 的 ArrayList(Collection c) 构造器 源码解读:
JDK1.7 、JDK1.8 的ArrayList 和 Vector 区别总结:
说明:
- ArrayList 、Vectory 的底层是通过 Object的 数组 来 实现的。
- 数组:在Java中是一种引用类型。在数据结构中,数组就是一种 紧密结构 之一的 一种数据结构!
- ArrayList 、Vector 底层的算法,就是 通过数组的 copy 来实现的。巧妙的结合了 很多编程思想在里面。
- 数组的表现形式:如图所示:
数组的优缺点:
数组的优点:
(1)相对于变量来说,数组可以存放大量的数据。
(2)按照索引查询元素 速度快。
(3)数组存储是:是有序的,可重复的。
(4)按照索引遍历数组方便。数组定义简单。并且访问也方便。可以随机访问其中的元素。
数据的缺点:
(1)一旦指定了长度,那么数组长度就被确定了,不可以更改,不适合动态存储。
(2)只能存储一种数据类型的数据。
(3)增加、删除元素效率慢。
(4)官方 只提供了一个 length 属性能够获取数组中应该存储多少个元素,
而 数组中实际元素的数量 是没有办法获取的,没有提供对应的方法 或者是属性 来获取。
(5)数组的空间必须是连续的。造成数组在内存中分配空间时 必须找到一块连续的内存空间。
所以说数组不可能定义得太大。因为内存中不可能有那么多 大的连续的内存空间来供数组使用。
解决这个问题的办法 就是使用链表。
ArrayList JDK1.7 版本底层扩容机制 实现源码解读:
(源码和StringBuilder 以及 StringBuffer 及其相似)
(以JDK1.7.0_21为例:)
(JDK1.7.0_79 这是JDK1.7的最后一个小版本,源码和JDK1.8差不多,所以直接读 1.8)
无参构造器创建ArrayList对象:
ArrayList中两个重要的属性:
跟进:
step 1:
step 2:
调用add方法,查看ArrayList集合中的 扩容机制:此时 ArrayList 中 elementDate 数组的初始化长度 为 10:
跟进:
step 1 :
step 2:
step 3:
再次添加执行触发数组的扩容:
step 1:
step 2:
step 3:
step 4:
step 5:
step 6: (debug时不会进来)
step 7 :一直 return,return到没有执行的代码位置:
step 8:一路 结束方法弹栈消失 , 回到 add方法中:
step 9: 添加元素完毕,add方法弹栈。回到调用 add 方法的地方。