Array 和 List 对比

概念

1. Array 和 List 都属于顺序表

2. Array 基于索引 (index) 的数据结构,使用索引在数组中搜索和读取, 速度快。获取数据的时间复杂度是 O(1), 但是删除数据开销很大,因为需要重排数组中的所有数据

List 是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,继承 Collection

3. Array 是一段连续的存储结构     int [ ] i = new int [3]     i  其实记录的是数组的首地址,而 i [1] 其实相当于在i的地址的基础上加上 1 个整数的地址偏移,然后再取这块地址中的值

List 是不连续的存储结构, List 的每个节点都有着一个 Next 属性,这个属性则记录着他的下一个节点的地址。也就是说当我们想找第 100 个节点的时候,他还是需要从第一个节点,然后做 99 次 Next 操作,才能找到 list [99] 节点

4. 数组必须要在初始化时分配固定的大小

List 由于空间不必连续,所以无须指定初始大小 

5. 指定位置插入指定元素:

  对于 Array 讲,有两套解决方案:

  A. 使用一个新数组,N+1 个元素重新赋值的过程。一个 for 循环,时间复杂度 O(n)。

  B. 在原数组上操作,那么首先需要为该数组预留空间,这是个很难办的事情。而且其后续元素的移动耗费时间复杂度仍为 O(n)

 

  对于List来讲,很多人说复杂度就是 O(1)。这其实是不合理的,因为 List 插入元素固然容易,但是在指定位置的插入,需要一个时间复杂度为 O(n) 的查找过程。

  但是只考虑时间复杂度是不够的,我们要考虑总体的情况。如果使用新数组,不仅浪费了新的空间,而且需要反复的赋值过程,是 N+1 次。如果不使用新数组,预留空间实在太麻烦,因此综上所述,还是 List 好

优化

1. 当不确定大小时,最好使用 List 代替 Array
2. 当需要大量的查找操作时,最好使用 Array
3. 当需要进行频繁的插入,删除操作时,最好使用 List 代替 Array
4. 由于 List 需要存储他下一个节点的地址,所以 List 比 Array 相对起来浪费了更多的空间

以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值