ArrayList和LinkedList区别
1、ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,所以索引数据快而插入数据慢;
LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
2、剖析
a、ArrayList查询快插入慢
ArrayList可以直接根据序号做查询操作,get(0)或get(1),时间复杂度为O(1);插入数据的时候,涉及到数据的移动(插入到中间位置),或者容量的扩容(初始容量过小,一直增加时),都需要时间。
b、LinkedList查询慢插入快
LinkedList由于每次按序号查询都需要进行前向或后向遍历,在get任何一个位置的数据的时候,都会把前面的数据走一遍,时间复杂度为O(N2);
比如获取get(2),的操作是:直接拿到0位的Node0的地址,从0位的Node0中找到下一个1位的Node1的地址,找到Node1,从1位的Node1中找到下一个2位的Node2的地址,找到Node2,拿到Node2里面的数据。
即使是一半前正序遍历、一半后倒序遍历,(1 + 0.5N) * 0.5N = 0.25N2 + 0.5N,LinikedList遍历的时间复杂度为O(N2),N为LinkedList的容量。
插入的时候,只需要node的prev记录本项的前项地址,next记录本项的后项地址,同时前项的next会记录本项地址,后项的prev会记录本项地址。不涉及到数据的移动和内存变化。