ArrayList(4)时间复杂度

在以前的文章里,我们已经看过了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源码分析,引入了时间复杂度,最后,我们来做个总结

根据前几篇文章我们可以看出来,在ArrayList中,底层数组存/取元素效率非常的高(get/set),时间复杂度是O(1),而查找,插入和删除元素效率似乎不太高,时间复杂度为O(n)。

当我们ArrayLIst里有大量数据时,这时候去频繁插入/删除元素会触发底层数组频繁拷贝,效率不高,还会造成内存空间的浪费,这个问题在另一个类:LinkedList里有解决方案,请期待后续文章讲解。

查找元素效率不高,在HashMap里有解决方案,请关注后续文章。

转载无限欢迎,但请注明「清浅吃糖」和「https://zhuanlan.zhihu.com/p/28016098」。转载请在文中保留此段,感谢您对作者版权的尊重。如需商业转载或刊登,请联系作者获得授权。自助转载请点击:https://www.rightknights.com/materi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值