1.我想从几个方面 谈谈二者的区别
1.1 底层数据结构? 1.ArrayList基于动态数组存储有序数据容器Arrays.copyOf
2.LinkedList基于链表方式存储有序数据的容器【1.6 使用的双向循环链表 1.7优化成无循环方式链表】
1.2 添加删除效率?元素在固定非末端位置的添加或者删除操作,LindedList【log(1)】优于ArrayList 【log(n-1)】,原因基于链表方式,修改 删除只需改动指针引用,数组需要移动对象。
1.3 为什么ArrayList随机访问速度快?
随机访问速度快,意味着根据某个条件查询也会更加的快。
ArrayList从原理上就是数据结构中的数组,也就是内存中一片连续的空间,这意味着,当我get(index)的时候,我可以根据 数组的(首地址+偏移量),直接计算出我想访问的第index个元素在内存中的位置。写过c的话,可以很容易的理解。
LinkedList可以简单理解为数据结构中的链表(说简单理解,因为其实是双向循环链表),在内存中开辟的不是一段连续的空 间,而是每个元素有一个[元素|下一元素地址]这样的内存结构。当get(index)时,只能从首元素开始,依次获得下一个元素 的 地址。用时间复杂度表示的话,ArrayList的get(n)是o(1),而LinkedList是o(n)。
ArrayList的get()方法:时间复杂度为O(1)
public AnyType get(int idx) {
if(idx < 0 || idx >= size())
throw new ArrayIndexOutOfBoundsException();
return theItems[idx];
}
LinkedList的get()方法:时间复杂度为O(N)
private Node<AnyType> getNode(int idx, int lower, int upper) {
Node<AnyType> p;
if(idx < lower || idx > upper)
throw new IndexOutOfBoundsException();
if(idx < (size() >> 1)) {
p = beginMarker.next;
for(int i = 0; i < idx; i++)
p = p.next;
}else {
p = endMarker;
for(int i = size(); i >idx; i--)
p = p.prev;
}
return p;
}
1.4 选择? 查询为主可以选择ArrayList 频繁更新可以选择LinedList,
1.5 并发如何选择? 【方法级别锁sysnchronized】Collections.synchronizedList(), Vector,
【在新创建的数组上操作规避并发】CopyOnWriteArrayList 。