ArrayList 和 LinkedList的底层数据结构

LinkedList的实现较为简单: 底层使用双向链表实现、保留了头尾两个指针 、LinkedList的其他操作基本都是基于上面那六个函数实现的,另外LinkedList也有 failFast 机制,这个机制主要在迭代器中使用。

数组和链表各自的特性

数组和链表的特性差异,本质是:连续空间存储和非连续空间存储的差异。主要有下面两点:     

  1. ArrayList:底层是Object数组实现的:由于数组的地址是连续的,数组支持O(1)随机访问;数组在初始化时需要指定容量;数组不支持动态扩容,像ArrayList、Vector和Stack使用的时候看似不用考虑容量问题(因为可以一直往里面存放数据);但是它们的底层实际做了扩容;数组扩容代价比较大,需要开辟一个新数组将数据拷贝进去,数组扩容效率低;适合读数据较多的场合。
  2. LinkedList:底层使用一个Node数据结构,有前后两个指针,双向链表实现的。相对数组,链表插入效率较高,只需要更改前后两个指针即可;另外链表不存在扩容问题,因为链表不要求存储空间连续,每次插入数据都只是改变last指针;另外,链表所需要的内存比数组要多,因为他要维护前后两个指针;它适合删除,插入较多的场景LinkedList还实现了Deque接口。

猜你喜欢

转载自my.oschina.net/u/1037605/blog/2980515