ArrayList部分一共五篇文章了,并且引入了时间复杂度来分析,
强烈建议大家一定要按顺序阅读
,相关文章分别是:
1、
ArrayList初始化
2、
ArrayList底层数组扩容原理
3、
时间复杂度
4、
ArrayList底层数组删除原理
5、本文
在以前的文章里,我们已经看过了add方法的源码,还有一个add方法,我们看一下, public void add(int index, E element) ,从指定位置添加元素
按照下标把元素添加到指定位置,想必大家都知道,我们直接上源码。
老规矩,我们还是画一画,当执行到System.arraycopy()这个方法时
我看到有些书上写的是依次移动元素到下一格,这种说法不够严谨,
所以我再强调一遍
,是依次复制插入位置及后面的数组元素,到后面一格,不是移动,因此,复制完后,arr[2],arr[3]指向对一个对象。
在代码执行完这一句
我们debug验证一下。
最后,在堆内存中创建李莫愁这个对象,把arr[2]的引用指向它。
再debug一下
最后我们来说说ArrayLIst这个对象里添加的时间复杂度:
如果我们不指定位置直接添加元素时(add(E element)),元素会默认会添加在最后,不会触发底层数组的复制,不考虑底层数组自动扩容的话,
时间复杂度为O(1)
,在指定位置添加元素(add(int index, E element)),需要复制底层数组,根据
最坏打算
,
时间复杂度是O(n)。
最后我们说一说读取元素,下面代码是获取List中下标为2的元素
看一下源码:
很简单,读取元素和数组长度无关,直接从底层数组里去拿元素。
评论区有人说,为什么是“李莫愁”,看样子是不太喜欢“李莫愁”,我们可以调用 set(int index, E element)方法来替换。
我们看一看这个方法的源码
很简单,就是往指定位置放入元素,并返回原来的元素,最后我们来画一画
图中“李莫愁”已经没有引用指向它了,JVM会在合适的时候回收它,底层数组第2个位置已经换成了“小龙女”,我们debug验证一下。
没错,已经换成小龙女了。
这是最后一期ArrayLIst源码分析,引入了时间复杂度,最后,我们来做个
总结