1,底层数据结构
ArrayList底层是数组 严格来说就是一个Object数组
LinkedList底层是链表 在1.7之前用的是循环链表 1.7及之后版本用的是双向链表
2,插入和删除是否受元素位置的影响
ArrayList插入和删除时会受到元素位置影响,原因是我们在进行插入删除时会有元素的移动(在中间插入一个元素后边的元素会向后移。如果把中间某个元素删掉,后边的元素会向前移)
LinkedList:如果能定位到这个元素的位置,LinkedList是不会受到元素位置的影响的。原因是我们底层是个链表结构,链表结构把某个结构摘掉之后,只要把对应位置的元素引用放给前一个结点就可以了
除了尾部的插入和删除 LinkedList插入和删除更有优势
3,是否支持高效的随机访问
LinkedList不支持高效的随机元素访问(因为它是链表,判断一个随机元素,双向链表要么从前向后,要么从后向前,一个节点一个节点的过)。
ArrayList支持(因为它底层是数组,内存是连续的)。随机访问适合ArrayList。
4,内存空间的占用
ArrayList内存空间占用主要体现在扩容(扩容会预留一定的空闲空间)
LinkedList没预留空间,(它的空间浪费主要体现在它每个节点都要记前一个结点的引用或后一个节点的引用,元素要把这些信息都保存下来)
ArrayList和LinkedList的源码对比
底层数据结构:
ArrayList底层是object数组
LinkedList底层有两个节点Nodefirst Last 去保留相关信息(双向链表)插入元素到列表尾端
Arraylist插入add方法直接插入在grow方法中新下标+老下标除2就是1.5倍扩容
LinkedLpst尾部插入:
add中直接Linklast在尾部入linkedlast方法中把last放在一个节点上构建一个新的节点如果为空就给first就就不是空就lnext++(下一个节点是新节点)
ArrayList增加元素到列表任意位置 。
有一个arraycopy拷的过程,把元素放至们要移动的位置上,每次插入操作都会进行一次数组复制,而这个操作在增元素到ist尾端的时候是不存在的的,大量数组重组会导到系统性能低下,并且插入元素越靠前数组重组的的开销越大。
LinkedList增加元素到列表任意位置:
add插入如果indek==size直接在尾部插入Last否则linkedBefore。
在Lif的尾端插入数据与在任意位置插入一样都设元素移动。
ArrayList删除任意位置元素对比
有arrayopy复制--之后变成空
Linked List删除任意位置元素对比
remove方法unlinl(node (indek))如如果这indx小于组长度的一半,说明在前半段,否则大于就就从后面遍历。靠中间系统性能低。
Arraylist获取数据:
get方法,直接通过下标获取高效随机访问
Linkedist获取数据:
node 需要通过循环找到对应的位置后获取随机访向效率低
Array List和LinkedList遍历列表对比
Arraylist 遍历效高于LinkeList Li:for和foreath没区别
增册LinkedList效率高 Ar:for>选代器>forEach
内存占用:
Arraylist底层扩容用的的grow 1.5倍扩容预留空间(浪费)
Linkedlist是保存前一个节点和后一个节点位置信息node (浪费)