首先这句话成立的前提下是在ArrayList和其他底层使用数组的集合中才成立,因为就数组本身而言不存在增加和删除,数组一旦创建,长度不能再变,然而增加元素会使数组长度+1,删除元素会使数组长度-1,那么ArrayList是如何使数组的长度“发生变化”的呢,其实当要增删元素时,ArrayList会把数组进行扩容和缩容,从而达到使数组长度变化的效果,但是其实扩容缩容前的数组和扩容缩容后的数组不是同一个数组,扩容缩容后会重新创建了一个数组,然后再把这个新的数组重新赋值给ArrayList底层维护的旧数组,这其实是调用了一个常用的数组工具类Arrays里面的copyOf方法实现的。
那么,如果我们每次添加元素时,底层都只把数组的长度+1,然后把新的数据添加进去,调用Arrays工具类复制一个新数组,这样如果频繁增加的话,岂不是会在创建数组上消耗一部分时间?所以,数组每次扩容时,都会根据一定的算法计算出所需要的长度,多预留几个容量来减少数组在扩容上的时间。
至于为什么增删慢,你可以这样想,数组是一片连续的内存空间,如果你想在特定的位置添加一个元素,那后面的元素都要往后挪;想删除一个元素,后面的元素都要往前挪,这个过程就很耗时。
比如我们想删除下标为2的元素,下标从3开始(包含)的元素都得往前挪动。
在下标2和下标3中间添加一个元素,那下标3开始(包含)的元素都要往后挪动,挪动后原来的下标3就变成下标4了,后面以此类推