Java 集合系列(4): LinkedList源码深入解析2
戳上面的藍(lán)字關(guān)注我們哦!
?精彩內(nèi)容?
?
精選java等全套視頻教程
精選java電子圖書
大數(shù)據(jù)視頻教程精選
java項目練習(xí)精選
第4部分 LinkedList遍歷方式
LinkedList遍歷方式
LinkedList支持多種遍歷方式。建議不要采用隨機(jī)訪問的方式去遍歷LinkedList,而采用逐個遍歷的方式。
(01) 第一種,通過迭代器遍歷。即通過Iterator去遍歷。
(02) 通過```訪問遍歷LinkedList
int size = list.size(); for (int i=0; i<size; i++) {list.get(i); ? ? ? ? }(03) 通過另外一種for循環(huán)來遍歷LinkedList
for (Integer integ:list) ;(04) 通過pollFirst()來遍歷LinkedList
while(list.pollFirst() != null);(05) 通過pollLast()來遍歷LinkedList
while(list.pollLast() != null);(06) 通過removeFirst()來遍歷LinkedList
try {while(list.removeFirst() != null); } catch (NoSuchElementException e) { }(07) 通過removeLast()來遍歷LinkedList
try {while(list.removeLast() != null); } catch (NoSuchElementException e) { }測試這些遍歷方式效率的代碼如下:
public class LinkedListThruTest {public static void main(String[] args) {// 通過Iterator遍歷LinkedListiteratorLinkedListThruIterator(getLinkedList()) ;// 通過快速隨機(jī)訪問遍歷LinkedListiteratorLinkedListThruForeach(getLinkedList()) ;// 通過for循環(huán)的變種來訪問遍歷LinkedListiteratorThroughFor2(getLinkedList()) ;// 通過PollFirst()遍歷LinkedListiteratorThroughPollFirst(getLinkedList()) ;// 通過PollLast()遍歷LinkedListiteratorThroughPollLast(getLinkedList()) ;// 通過removeFirst()遍歷LinkedListiteratorThroughRemoveFirst(getLinkedList()) ;// 通過removeLast()遍歷LinkedListiteratorThroughRemoveLast(getLinkedList()) ;}private static LinkedList getLinkedList() {LinkedList llist = new LinkedList();for (int i=0; i<100000; i++)llist.addLast(i);return llist;}/*** 通過快迭代器遍歷LinkedList*/private static void iteratorLinkedListThruIterator(LinkedList<Integer> list) {if (list == null)return ;// 記錄開始時間long start = System.currentTimeMillis();for(Iterator iter = list.iterator(); iter.hasNext();)iter.next();// 記錄結(jié)束時間long end = System.currentTimeMillis();long interval = end - start;System.out.println("iteratorLinkedListThruIterator:" + interval+" ms");}/*** 通過快速隨機(jī)訪問遍歷LinkedList*/private static void iteratorLinkedListThruForeach(LinkedList<Integer> list) {if (list == null)return ;// 記錄開始時間long start = System.currentTimeMillis();int size = list.size();for (int i=0; i<size; i++) {list.get(i); ? ? ? ?}// 記錄結(jié)束時間long end = System.currentTimeMillis();long interval = end - start;System.out.println("iteratorLinkedListThruForeach:" + interval+" ms");}/*** 通過另外一種for循環(huán)來遍歷LinkedList*/private static void iteratorThroughFor2(LinkedList<Integer> list) {if (list == null)return ;// 記錄開始時間long start = System.currentTimeMillis();for (Integer integ:list) ;// 記錄結(jié)束時間long end = System.currentTimeMillis();long interval = end - start;System.out.println("iteratorThroughFor2:" + interval+" ms");}/*** 通過pollFirst()來遍歷LinkedList*/private static void iteratorThroughPollFirst(LinkedList<Integer> list) {if (list == null)return ;// 記錄開始時間long start = System.currentTimeMillis();while(list.pollFirst() != null);// 記錄結(jié)束時間long end = System.currentTimeMillis();long interval = end - start;System.out.println("iteratorThroughPollFirst:" + interval+" ms");}/*** 通過pollLast()來遍歷LinkedList*/private static void iteratorThroughPollLast(LinkedList<Integer> list) {if (list == null)return ;// 記錄開始時間long start = System.currentTimeMillis();while(list.pollLast() != null);// 記錄結(jié)束時間long end = System.currentTimeMillis();long interval = end - start;System.out.println("iteratorThroughPollLast:" + interval+" ms");}/*** 通過removeFirst()來遍歷LinkedList*/private static void iteratorThroughRemoveFirst(LinkedList<Integer> list) {if (list == null)return ;// 記錄開始時間long start = System.currentTimeMillis();try {while(list.removeFirst() != null);} catch (NoSuchElementException e) {}// 記錄結(jié)束時間long end = System.currentTimeMillis();long interval = end - start;System.out.println("iteratorThroughRemoveFirst:" + interval+" ms");}/*** 通過removeLast()來遍歷LinkedList*/private static void iteratorThroughRemoveLast(LinkedList<Integer> list) {if (list == null)return ;// 記錄開始時間long start = System.currentTimeMillis();try {while(list.removeLast() != null);} catch (NoSuchElementException e) {}// 記錄結(jié)束時間long end = System.currentTimeMillis();long interval = end - start;System.out.println("iteratorThroughRemoveLast:" + interval+" ms");} }iteratorLinkedListThruIterator:8 ms
iteratorLinkedListThruForeach:3724 ms
iteratorThroughFor2:5 ms
iteratorThroughPollFirst:8 ms
iteratorThroughPollLast:6 ms
iteratorThroughRemoveFirst:2 ms
iteratorThroughRemoveLast:2 ms
由此可見,遍歷LinkedList時,使用removeFist()或removeLast()效率最高。但用它們遍歷時,會刪除原始數(shù)據(jù);若單純只讀取,而不刪除,應(yīng)該使用第3種遍歷方式。
無論如何,千萬不要通過隨機(jī)訪問去遍歷LinkedList!
第5部分 LinkedList示例
下面通過一個示例來學(xué)習(xí)如何使用LinkedList的常用API
import java.util.List; import java.util.Iterator; import java.util.LinkedList; import java.util.NoSuchElementException; /** @desc LinkedList測試程序。** @author skywang* @email ?kuiwu-wang@163.com*/ public class LinkedListTest {public static void main(String[] args) {// 測試LinkedList的APItestLinkedListAPIs() ;// 將LinkedList當(dāng)作 LIFO(后進(jìn)先出)的堆棧useLinkedListAsLIFO();// 將LinkedList當(dāng)作 FIFO(先進(jìn)先出)的隊列useLinkedListAsFIFO();}/** 測試LinkedList中部分API*/private static void testLinkedListAPIs() {String val = null;//LinkedList llist;//llist.offer("10");// 新建一個LinkedListLinkedList llist = new LinkedList();//---- 添加操作 ----// 依次添加1,2,3llist.add("1");llist.add("2");llist.add("3");// 將“4”添加到第一個位置llist.add(1, "4");System.out.println("\nTest \"addFirst(), removeFirst(), getFirst()\"");// (01) 將“10”添加到第一個位置。 ?失敗的話,拋出異常!llist.addFirst("10");System.out.println("llist:"+llist);// (02) 將第一個元素刪除。 ? ? ? ?失敗的話,拋出異常!System.out.println("llist.removeFirst():"+llist.removeFirst());System.out.println("llist:"+llist);// (03) 獲取第一個元素。 ? ? ? ? ?失敗的話,拋出異常!System.out.println("llist.getFirst():"+llist.getFirst());System.out.println("\nTest \"offerFirst(), pollFirst(), peekFirst()\"");// (01) 將“10”添加到第一個位置。 ?返回true。llist.offerFirst("10");System.out.println("llist:"+llist);// (02) 將第一個元素刪除。 ? ? ? ?失敗的話,返回null。System.out.println("llist.pollFirst():"+llist.pollFirst());System.out.println("llist:"+llist);// (03) 獲取第一個元素。 ? ? ? ? ?失敗的話,返回null。System.out.println("llist.peekFirst():"+llist.peekFirst());System.out.println("\nTest \"addLast(), removeLast(), getLast()\"");// (01) 將“20”添加到最后一個位置。 ?失敗的話,拋出異常!llist.addLast("20");System.out.println("llist:"+llist);// (02) 將最后一個元素刪除。 ? ? ? ?失敗的話,拋出異常!System.out.println("llist.removeLast():"+llist.removeLast());System.out.println("llist:"+llist);// (03) 獲取最后一個元素。 ? ? ? ? ?失敗的話,拋出異常!System.out.println("llist.getLast():"+llist.getLast());System.out.println("\nTest \"offerLast(), pollLast(), peekLast()\"");// (01) 將“20”添加到第一個位置。 ?返回true。llist.offerLast("20");System.out.println("llist:"+llist);// (02) 將第一個元素刪除。 ? ? ? ?失敗的話,返回null。System.out.println("llist.pollLast():"+llist.pollLast());System.out.println("llist:"+llist);// (03) 獲取第一個元素。 ? ? ? ? ?失敗的話,返回null。System.out.println("llist.peekLast():"+llist.peekLast());// 將第3個元素設(shè)置300。不建議在LinkedList中使用此操作,因為效率低!llist.set(2, "300");// 獲取第3個元素。不建議在LinkedList中使用此操作,因為效率低!System.out.println("\nget(3):"+llist.get(2));// ---- toArray(T[] a) ----// 將LinkedList轉(zhuǎn)行為數(shù)組String[] arr = (String[])llist.toArray(new String[0]);for (String str:arr) System.out.println("str:"+str);// 輸出大小System.out.println("size:"+llist.size());// 清空LinkedListllist.clear();// 判斷LinkedList是否為空System.out.println("isEmpty():"+llist.isEmpty()+"\n");}/*** 將LinkedList當(dāng)作 LIFO(后進(jìn)先出)的堆棧*/private static void useLinkedListAsLIFO() {System.out.println("\nuseLinkedListAsLIFO");// 新建一個LinkedListLinkedList stack = new LinkedList();// 將1,2,3,4添加到堆棧中stack.push("1");stack.push("2");stack.push("3");stack.push("4");// 打印“棧”System.out.println("stack:"+stack);// 刪除“棧頂元素”System.out.println("stack.pop():"+stack.pop());// 取出“棧頂元素”System.out.println("stack.peek():"+stack.peek());// 打印“棧”System.out.println("stack:"+stack);}/*** 將LinkedList當(dāng)作 FIFO(先進(jìn)先出)的隊列*/private static void useLinkedListAsFIFO() {System.out.println("\nuseLinkedListAsFIFO");// 新建一個LinkedListLinkedList queue = new LinkedList();// 將10,20,30,40添加到隊列。每次都是插入到末尾queue.add("10");queue.add("20");queue.add("30");queue.add("40");// 打印“隊列”System.out.println("queue:"+queue);// 刪除(隊列的第一個元素)System.out.println("queue.remove():"+queue.remove());// 讀取(隊列的第一個元素)System.out.println("queue.element():"+queue.element());// 打印“隊列”System.out.println("queue:"+queue);} }運行結(jié)果:
Test "addFirst(), removeFirst(), getFirst()"
llist:[10, 1, 4, 2, 3]
llist.removeFirst():10
llist:[1, 4, 2, 3]
llist.getFirst():1
Test "offerFirst(), pollFirst(), peekFirst()"
llist:[10, 1, 4, 2, 3]
llist.pollFirst():10
llist:[1, 4, 2, 3]
llist.peekFirst():1
Test "addLast(), removeLast(), getLast()"
llist:[1, 4, 2, 3, 20]
llist.removeLast():20
llist:[1, 4, 2, 3]
llist.getLast():3
Test "offerLast(), pollLast(), peekLast()"
llist:[1, 4, 2, 3, 20]
llist.pollLast():20
llist:[1, 4, 2, 3]
llist.peekLast():3
get(3):300
str:1
str:4
str:300
str:3
size:4
isEmpty():true
useLinkedListAsLIFO
stack:[4, 3, 2, 1]
stack.pop():4
stack.peek():3
stack:[3, 2, 1]
useLinkedListAsFIFO
queue:[10, 20, 30, 40]
queue.remove():10
queue.element():20
queue:[20, 30, 40]
回復(fù)以下關(guān)鍵字獲取更多學(xué)習(xí)資源
java基礎(chǔ)|html5|css|js|jquery|angularJs|ajax|node.js|javaEE基礎(chǔ)| |struts2|hibernate|spring|svn|maven|springmvc|mybatis|linux|oracle| |luncene|solr|redis|springboot|架構(gòu)師資源|dubbo|php|webservice|c++基礎(chǔ)|nginx|mysql|sqlserver|asp.net|大數(shù)據(jù)|java項目
更多學(xué)習(xí)資源逐步更新,請置頂公眾號不要錯過更新
好好學(xué)java
每日推送java優(yōu)質(zhì)文章、視頻教程、熱點資訊
微信ID:sihailoveyan
長按左側(cè)二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的Java 集合系列(4): LinkedList源码深入解析2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 集合系列(4): Linked
- 下一篇: touch: cannot touch