链表和数组的区别

数组是由下标索引和data两部分组成

链表是由data和指向下一个数据的指针地址两部分组成

数组和链表的区别如下: 

  1. 数组静态分配内存, 链表动态分配内存;
  2. 数组在内存中连续, 链表不连续;
  3. 数组元素在栈区, 链表元素在堆区;
  4. 数组利用下标定位, 时间复杂度O(1), 链表定位元素时间复杂度O(n)
  5. 数组插入或删除元素的时间复杂度O(n), 链表的时间复杂度O(1)

数组的特点:

  • 在内存中, 数组是一块连续的区域. 就比如去看电影, 这几个人在电影院就必须坐在一起
  • 数组需要预留空间, 在使用前要先申请内存大小, 可能会浪费内存空间. 比如看电影时, 为了保证10个人可以坐在一起, 必须提前订好10个连续的座位. 这样的好处使, 可以保证是个人可以在一起, 但是缺点使, 如果来的人不够10个, 剩下的位置就浪费了. 如果临时多来了一个人, 那么10个就不够用, 这是可能需要等到第11个位置上的人挪走, 或者使她们11个人重新找一个11连坐的位置, 但是无论怎样效率都很低, 如果没有找到符合要求的座位, 就没办法坐了.
  • 插入数据和删除数据效率低下.  插入数据时, 这个位置后面的数据在内存中都要向后移, 删除数据时, 这个数据后面的数据又要往前移. 比如原来去了5个人, 然后后来又去了一个人要坐在第三个位置上, 那么第三个到第五个位置上的人都要向后移动一个位置, 将第三个位置留给新来的人. 当这个人走了的时候, 因为要连在一起, 所以它后面的人要往前移动一个位置, 把这个空位补上.
  • 随机读取效率很高. 因为数组是连续的, 知道每个数据的内存地址, 可以直接找到给地址的数据.
  • 不利于扩展, 数组定义的空间不够时要重新定义数组

链表的特点

  • 在内存中可以存在任何地方, 不要求连续, 在电影院几个人可以随便坐.
  • 每个数据都保存了下一个数据的内存地址, 通过这个地址找到下一个数据. 第一个人知道第二个人的座位号, 第二个人知道第三个人的座位号....
  • 增加数据和删除数据很容易, 再来个人随便坐, 比如来了个人要坐第三个位置, 她只需要将自己的位置告诉第二个人, 然后问第二个人拿到第三个人的位置就可以, 其他人不用动.
  • 查找数据效率低, 因为不具有随机访问性, 所以访问某个位置的数据都要从第一个数据开始访问, 根据第一个数据保存的下一个数据的地址找到第二个数据, 以此类推. 要找到第三个人, 必须从第一个人问起.
  • 不指定大小, 扩展方便. 链表不用定义大小, 数据随意增删.

各自的优缺点: 

数组的优点: 

  1. 随机访问性强
  2. 查找速度快

数组的缺点: 

  1. 插入和删除的效率低
  2. 可能浪费内存
  3. 内存空间要求高, 必须要有足够的连续的内存空间
  4. 数组大小固定, 不能动态拓展

链表的优点: 

  1. 插入删除的速度快
  2. 内存利用率高, 不会浪费内存
  3. 大小没有固定, 拓展很灵活

链表的缺点: 

不能随机查找, 必须从第一个开始遍历, 查找效率低

 数组链表
读取O(1)O(n)
插入O(n)O(1)
删除O(n)O(1)

注意: 

Vector, ArrayList都是以数组的形式存储在内存中的, 所以查询效率高, 新增和删除的效率不高. 但是Vector被synchronized修饰, 所以线程是安全的, ArrayList线程不安全.

LinkedList则是以链表的形式进行存储, 所以查询效率低,  新增和删除效率高, 并且线程不安全.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值