解析:为什么说数组查找快,增删慢。

首先这句话成立的前提下是在ArrayList和其他底层使用数组的集合中才成立,因为就数组本身而言不存在增加和删除,数组一旦创建,长度不能再变,然而增加元素会使数组长度+1,删除元素会使数组长度-1,那么ArrayList是如何使数组的长度“发生变化”的呢,其实当要增删元素时,ArrayList会把数组进行扩容和缩容,从而达到使数组长度变化的效果,但是其实扩容缩容前的数组和扩容缩容后的数组不是同一个数组,扩容缩容后会重新创建了一个数组,然后再把这个新的数组重新赋值给ArrayList底层维护的旧数组,这其实是调用了一个常用的数组工具类Arrays里面的copyOf方法实现的。

那么,如果我们每次添加元素时,底层都只把数组的长度+1,然后把新的数据添加进去,调用Arrays工具类复制一个新数组,这样如果频繁增加的话,岂不是会在创建数组上消耗一部分时间?所以,数组每次扩容时,都会根据一定的算法计算出所需要的长度,多预留几个容量来减少数组在扩容上的时间。

至于为什么增删慢,你可以这样想,数组是一片连续的内存空间,如果你想在特定的位置添加一个元素,那后面的元素都要往后挪;想删除一个元素,后面的元素都要往前挪,这个过程就很耗时。

 

比如我们想删除下标为2的元素,下标从3开始(包含)的元素都得往前挪动。

在下标2和下标3中间添加一个元素,那下标3开始(包含)的元素都要往后挪动,挪动后原来的下标3就变成下标4了,后面以此类推

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值