终于决定了写下第一篇文章,老生常谈的List
List在Java开发工作中的重要性不言而喻,之前一直对List一知半解,甚至到现在也不敢说完全懂,写这篇文章一是给自己加深下记忆,也是写出来大家一起聊一下,跟大家学习
首先我们说下ArrayList
ArrayList底层是基于数组实现的,所以本质上ArrayList其实就是数组的封装
众所周知,数组是由相同类型的元素组成的一种数据结构,需要连续的内存来存储,可以充分发挥cpu的性能
ArrayList未初始化时是共享一个长度为0的数组,这样可以减少不必要的内存消耗,已初始化时数组长度为10
ArrayList为什么查询快呢?
刚才我们说了ArrayList是一个数组,数据是在内存中连续存储的,查询的时候减少了内存IO,easy
ArrayList为什么增删慢呢?
因为涉及到了数组的扩容和拷贝,新增数据时,要看当前插入位置数组容量够不够,不够了,那就扩容(1.5倍),扩容完毕,把老数组元素拷贝到拷贝的新数组,然后插入元素,删除跟这个也一样的
再来说下LinkedList
LinkedList是基于链表实现的,不需要声明大小,元素增加或删除时大小随之改变
并且链表不同于数组,链表不需要连续的内存进行数据存储,而是在每个节点里存储了上一个节点和下一个节点的位置
相对数组来说,链表开销更大,因为链表存储了上一个和下一个节点的位置,数组则没有
另外,链表还可作为列表或队列来使用,因为它实现了Deque接口
LinkedList为什么查询慢呢?
因为查询的时候链表需要从头到尾遍历,直到找出需要的数据,数组则直接用下标取值
LinkedList为什么增删快呢?
其实不一定,增删的时候链表同样也是要遍历的,所以效率上来讲,并不一定比ArrayList快
那么问题又来了,什么时候增删LinkedList才会更快呢?
我们知道对于ArrayList来说,增删的复杂度主要在于拷贝数组,而LinkedList没有拷贝的工作内容,数据量小时,两者增删差不多,但是如果数据量很大时,差距就很明显了,因为LinkedList不需要扩容拷贝
以上就是我对ArrayList和LinkedList的理解,请大家多多指教