首先来看ArrayList和LinkedList的集成类和接口的区别。
// lang java
public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Queue<E>, Cloneable, Serializable
ArrayList实现了随机访问的接口,LinkedList实现了Quene的接口。
ArrayList是基于数组实现的list,而LinkedList是基于链表实现的list。所以,ArrayList拥有着数组的
特性,LinkedList拥有着链表的特性。
优缺点
ArrayList
优点:适合随机读取的时候,读取速度快,可以一步get(index)。
缺点:添加值很慢——一方面,添加数据在array中间的时候,需要移动后面的数;另一方面,当长度大于
初始长度的时候,每添加一个数,都会需要扩容。
LinkedList:双向链表
优点:添加值很快——添加在list中间也只需要更改指针;长度不固定。
实现栈和队列方面,LinkedList要优于ArrayList。
LinkedList的remove(int)和remove(Object)的方法的时间复杂度都是O(n),不是O(1).因为会有一个查找的
过程。
LinkedList的remove(int)要优于remove(Object),因为remove(int)在查找的时候,会从链表的中间
查找,如果int比中间小,找前半部分,否则找后半部分(类似二分查找)。
ArrayList的增删比LinkedList的开销更大,因为除了有查找的时间复杂度外,还有增删的移动过程。
使用LinkedeList<Integer>实现对链表的排序(sougou笔试题)
//LinkedList<Integer>实现链表的排序 使用插入排序
public LinkedList<Integer> insertSortForLinkedList(LinkedList<Integer> list){
int len=list.size();
for(int i=1;i<len;i++){
int j=i-1;
int temp=list.get(i);
list.remove(i); //注意这里需要删除元素
while(j>=0&&temp<list.get(j)){
j--;
}
list.add(j+1,temp);
}
return list;
}
使用LinkedeList实现栈和队列
import java.util.*;
class Stack{
private LinkedList list;
public Stack(){
list=new LinkedList();
}
public Object top(){ //输出最上面的元素
if(list.size()!=0){
return list.getFirst();
}
return -1;
}
public void pop(){ //出栈
if(list.size()!=0){
list.removeFirst();
}
}
public void push(Object v){ //入栈
list.addFirst(v);
}
public int getLen(){
return list.size();
}
}
ArrayList和LinkedList有什么区别?
ArrayList和LinkedList都实现了List接口,他们有以下的不同点:
ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。
与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接
在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的
时候,不需要像数组那样重新计算大小或者是更新索引。
LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,
一个指向下一个元素。
1) 因为 Array 是基于索引 (index) 的数据结构,它使用索引在数组中搜索和读取数据是很快的。
Array 获取数据的时间复杂度是 O(1), 但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。
2) 相对于 ArrayList , LinkedList 插入是更快的。因为 LinkedList 不像 ArrayList 一样,不需要
改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是 ArrayList 最坏的
一种情况,时间复杂度是 O(n) ,而 LinkedList 中插入或删除的时间复杂度仅为 O(1) 。 ArrayList 在
插入数据时还需要更新索引(除了插入数组的尾部)。
3) 类似于插入数据,删除数据时, LinkedList 也优于 ArrayList 。
4) LinkedList 需要更多的内存,因为 ArrayList 的每个索引的位置是实际的数据,而 LinkedList 中的
每个节点中存储的是实际的数据和前后节点的位置 ( 一个 LinkedList 实例存储了两个值: Node<E>
first 和 Node<E> last 分别表示链表的其实节点和尾节点,每个 Node 实例存储了三个值: E item,
Node next,Node pre) 。
什么场景下更适宜使用 LinkedList,而不用ArrayList
1) 你的应用不会随机访问数据 。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素
顺序数到第n个数据,然后读取数据。
2) 你的应用更多的插入和删除元素,更少的读取数据 。因为插入和删除元素不涉及重排数据,所以它要
比ArrayList要快。
换句话说,ArrayList的实现用的是数组,LinkedList是基于链表,ArrayList适合查找,LinkedList
适合增删
以上就是关于 ArrayList和LinkedList的差别。你需要一个不同步的基于索引的数据访问时,请尽量
使用ArrayList。ArrayList很快,也很容易使用。但是要记得要给定一个合适的初始大小,尽可能的减少
更改数组的大小。
Java中ArrayList与LinkedList的区别
一般大家都知道ArrayList和LinkedList的区别:
1. ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。
2. 对于随机访问,ArrayList优于LinkedList
3. 对于插入和删除操作,LinkedList优于ArrayList
4. LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,
一个指向前一个元素,一个指向后一个元素。
一.在时间复杂度上的区别
假设我们有两个很大的列表,它们里面的元素已经排好序了,这两个列表分别是ArrayList类型和LinkedList
类型的,现在我们对这两个列表来进行二分查找(binary search),比较它们的查找速度。
对于随机访问,ArrayList的访问速度更快。对于插入操作,LinkedList 的速度更快。
二.在空间复杂度上的区别
在LinkedList中有一个私有的内部类,定义如下:
private static class Entry {
Object element;
Entry next;
Entry previous;
}
LinkedList中的每一个元素中还存储了它的前一个元素的索引和后一个元素的索引。
ArrayList使用一个内置的数组来存储元素,这个数组的起始容量是10,当数组需要增长时,新的容量按如下
公式获得:新容量 = 旧容量*1.5 + 1,也就是说每一次容量大概会增长50%
ArrayList和LinkedList的区别如下:
1. ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。
2. 对于随机访问,ArrayList优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行
随机访问。而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,在这种情况下,查找
某个元素的时间复杂度是O(n)
3. 对于插入和删除操作,LinkedList优于ArrayList,因为当元素被添加到LinkedList任意位置的
时候,不需要像ArrayList那样重新计算大小或者是更新索引。
4. LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,
一个指向前一个元素,一个指向后一个元素。