LinkedList
是一个继承于AbstractSequentialList
的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
LinkedList
实现 List
接口,能进行队列操作。
LinkedList
实现 Deque
接口,即能将LinkedList
当作双端队列使用。
ArrayList
底层是由数组支持,而LinkedList
是由双向链表实现的,其中的每个对象包含数据的同时还包含指向链表中前一个与后一个元素的引用。
LinkedList遍历方式
迭代器遍历
Iterator<Integer> iterator=linkedList.iterator();
while(iterator.hasNext()){
iterator.next();
}
for循环get()遍历
for(int i=0;i<linkedList.size();i++){
linkedList.get(i);
}
Foreach循环遍历
for(Integer i:linkedList);
通过pollFirst()或pollLast()遍历
while(linkedList.size()!=0){
linkedList.pollFirst();
}
通过removeFirst()或removeLast()遍历
while(linkedList.size()!=0){
linkedList.removeFirst();
}
效率测试
测试以上几种遍历方式的效率,部分代码如下:
System.out.println("-----------------");
linkedList.clear();
for(int i=0;i<10000;i+=){
linkedList.add(i);
}
//迭代器遍历
long start=System.currentTimeMillis();
Iterator<Interator> iterator=linkedList.iterator();
whie(iterator.hasNext()){
iterator.next();
}
long end=System.currentTimeMillis();
System.out.println("Iterator:"+(end-start)+"millis");
//顺序遍历(随机遍历)
start=System.currentTimeMillis();
for(int i=0;i<linkedList.size();i++){
linkedList.get(i);
}
end=System.currentTimeMillis();
System.out.println("for:"+(end-start)+"ms");
//另一种for循环
start=System.currentTimeMillis();
for(Integer i:linkedList);
end=System.currentTimeMillis();
System.out.println("for2"+(end-start)+"ms");
// 通过pollFirst()或pollLast()来遍历LinkedList
LinkedList<Interator> temp1=new linkedList<>();
temp1.addAll(linkedList);
start=System.currentTimeMillis();
while(temp1.size()!=0){
temp1.pollFirst();
}
end=System.currentTimeMillis();
System.out.println("pollFirst:"+(end-start)+"ms");
// 通过removeFirst()或removeLast()来遍历LinkedList
LinkedList<Integer>temp2=new LinkList<>();
temp2.addAll(linkedList);
start=System.currentTimeMillis();
while(temp2.siez()!=0){
temp2.removeFirst();
}
end=System.currentTimeMillis();
System.out.println("removeFirst:"+(end-start)+"ms");
输出:
-----------------------------------------
Iterator:17 ms
for:8419 ms
for2:12 ms
pollFirst()或pollLast():12 ms
removeFirst()或removeLast():10 ms
由测试结果可以看出,遍历LinkedList
时,使用removeFirst()
或removeLast()
效率最高,而for循环get()效率最低,应避免使用这种方式进行。应当注意的是,使用pollFirst()
或pollLast()
或removeFirst()
或removeLast()
遍历时,会删除原始数据,若只单纯的读取,应当选用第一种或第三种方式。
LinkedList示例
import java.util.Iterator;
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList<Integer> linkedList=new LinkedList<>();
/******************基本操作**************/
linkedList.addFirst(0);//添加元素到列表开头
linkedList.add(1);//在列表结尾添加元素
linkedList.add(2,2);//在指定的位置添加元素
linkedList.addLast(3);//添加元素到列表结尾
System.out.println("LinkedList:"+linkedList);
System.out.println("getFirst():"+linkedList.getFirst());//返回列表第一个元素
System.out.println("getLast():"+linkedList.getLast());//返回列表最后一个元素
System.out.println("removeFirst():"+linkedList.removeFirst());//移除并返回列表第一个元素
System.out.println("removeLast():"+linkedList.removeLast());//移除并返回列表的最后一个元素
System.out.println("After remove:"+linkedList);
System.out.println("contains(1) is"+linkedList.contains(1));//判断此列表包含指定元素,如果是,则返回true
System.out.println("Size is:"+linkedList.size());// 返回此列表的元素个数
/************位置访问操作*****************/
System.out.println("---------------------------");
linkedList.set(1, 3);// 将此列表中指定位置的元素替换为指定的元素
System.out.println("After set(1,3):"+linkedList);
System.out.println("get(1):"+linkedList.get(1));// 返回此列表中指定位置处的元素
/*************Search操做***************/
System.out.println("--------------------------------");
linkedList.add(3);
System.out.println("indexOf(3):"+linkedList.indexOf(3));//返回此列表中首次出现的指定元素的索引
System.out.println("lastIndexOf(3):"+linkedList.lastIndexOf(3));// 返回此列表中最后出现的指定元素的索引
/**************Queue操作************************/
System.out.println("-------------------------------");
linkedList.offerFirst(2);// 在此列表的开头插入指定的元素
System.out.println("After offerFirst(2):"+linkedList);
linkedList.offerLast(5);
System.out.println("After offerLast(5)"+linkedList); // 在此列表末尾插入指定的元素
System.out.println("peekFirst():"+linkedList.peekFirst());// 获取但不移除此列表的第一个元素
System.out.println("peekLast():"+linkedList.peekLast());// 获取但不移除此列表的最后一个元素
System.out.println("After pollFirst():"+linkedList.pollFirst()); // 获取并移除此列表的第一个元素
System.out.println("After pollLast():"+linkedList.pollLast()); // 获取并移除此列表的最后一个元素
System.out.println("After pop():"+linkedList.pop());// 从此列表所表示的堆栈处弹出一个元素(获取并移除列表第一个元素)
linkedList.push(2);// 将元素推入此列表所表示的堆栈(插入到列表的头)
System.out.println("After push(2):"+linkedList);
linkedList.add(3);
linkedList.removeFirstOccurrence(3);// 从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表)
System.out.println("After removeFirstOccurrence(3):"+linkedList);
linkedList.removeLastOccurrence(3);
System.out.println("After removeLastOccurrence(3):"+linkedList);// 从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表)
/**********************遍历操作**************************/
System.out.println("---------------------------------");
linkedList.clear();
for(int i=0;i<10000;i++){
linkedList.add(i);
}
//迭代器遍历
long start=System.currentTimeMillis();
Iterator<Integer> iterator=linkedList.iterator();
while(iterator.hasNext()){
iterator.next();
}
long end=System.currentTimeMillis();
System.out.println("Ierator:"+(end-start)+"ms");
//顺序遍历
start=System.currentTimeMillis();
for(int i=0;i<linkedList.size();i++){
linkedList.get(i);
}
end=System.currentTimeMillis();
System.out.println("for:"+(end-start)+"ms");
//另一种for循环遍历
start=System.currentTimeMillis();
for(Integer i:linkedList);
end=System.currentTimeMillis();
System.out.println("for2"+(end-start)+"ms");
//通过pollFirst()或pollLast()来遍历linkedList
LinkedList<Integer>temp1=new LinkedList<>();
temp1.addAll(linkedList);
start=System.currentTimeMillis();
while(temp1.size()!=0){
temp1.pollFirst();
}
end=System.currentTimeMillis();
System.out.println("pollFirst()或pollLast():"+(end-start)+"ms");
//通过removeFirst()或removeLast()来遍历linkedList
LinkedList<Integer>temp2=new LinkedList<>();
temp2.addAll(linkedList);
start=System.currentTimeMillis();
while(temp2.size()!=0){
temp2.removeFirst();
}
end=System.currentTimeMillis();
System.out.println("removeFirst()或removeLast():"+(end-start)+"ms");
}
}
LinkedList和ArrayList比较
LinkedList
中插入元素很快,而ArrayList
中插入元素很慢LinkedList
中随机访问很慢,而ArrayList
中随机访问很快