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
中隨機訪問很快