ArrayList 和 LinkedList 的区别是什么?
相同点:都是List接口下的实现类,都是单列集合;都是线程不安全的。
不同点:
-
数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表(凡是出现linked都是基于双向链表的)的数据结构实现。数组大小固定,不能动态拓展。 内存空间要求高,必须有足够的连续内存空间。数组可能浪费内存空间,容量存满的时候再添加元素需要扩充,没存满又造成部分内存空间的浪费;而链表不存在长度固定,也不需要扩容,内存空间利用率高,但是每个元素都有前驱节点和后驱节点的空间消耗。
-
随机访问效率:对于随机访问的get(index)和set(index),ArrayList要优于LinkedList,因为LinkedList要移动指针.而数组可以直接通过数组名【index】获取或者设置元素。
-
增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 中间和头部增删,会涉及数组元素位置的移动,效率比较低。
-
内存空间占用:LinkedList 比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素,数据量大的话会占用不少内存空间。
综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。
扩展:ArrayList和LinkedList哪个更占空间:
ArrayList:ArrayList中数组被transient来修饰:
不想序列化的对象就可以用transient来修饰,用transient修饰elementData意味着我不希望elementData数组被序列化。
总结回答:
一般情况下,LinkedList的占用空间更大,因为每个节点要维护指向前后地址的两个节点,但也不是绝对,如果刚好数据量超过ArrayList默认的临时值时,ArrayList占用的空间也是不小的,因为扩容的原因会浪费将近原来数组一半的容量,不过,因为ArrayList的数组变量是用transient关键字修饰的,如果集合本身需要做序列化操作的话,ArrayList这部分多余的空间不会被序列化。
其他详细用法内容参考:
https://zhuanlan.zhihu.com/p/303051913