数组的特点

1、高效的随机访问

2、低效的插入和删除

数组插入的优化方案
如果数组中的数据是有序的,我们在某个位置插入一个新的元素时,就必须按照刚才的方法搬移 k之后的数据。但是,如果数组中存储的数据并没有任何规律,数组只是被当作一个存储数据的集合。在这种情况下,如果要将某个数组插入到第 k个位置,为了避免大规模的数据搬移,我们还有一个简单的办法就是,直接将第 k 位的数据搬移到数组元素的最后,把新的元素直接放入第 k 个位置。这种处理思想会在快排中用到。

数组删除的优化方案:
我们可以先记录下已经删除的数据。每次的删除操作并不是真正地搬移数据,只是记录数据已经被删除。当数组没有更多空间存储数据时,我们再触发执行一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移。这种处理思想像JVM 标记清除垃圾回收算法。

ArrayList源码分析:
1:创建ArrayList时采用默认的构造函数创建集合然后往里添加元素,第一次添加时将数组扩容到10的大小,之后添加元素都不会在扩容,直到第11次添加然后扩容1.5倍取整,此后如果需要扩容都是1.5倍取整,但是扩容到的最大值是Integer.MAX_VALUE。
2:每次扩容时都会创建一个新的数组,然后将原数组中的数据搬移到新的数组中
所以回到开始我们所说的: 如果事先能确定需要存储的数据大小,最好在创建 ArrayList 的时候事先指定数据大小。
3:Java ArrayList 无法存储基本类型,比如 int、long,需要封装为 Integer、Long 类。

时间复杂度:
用数组存储的话,采用二分法可以在 O(logn) 的时间里找到指定的元素。
进行插入和删除这个动作所需的时间复杂度为 O(n)。

猜你喜欢

转载自blog.csdn.net/weixin_41699562/article/details/103931845
今日推荐