日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 集合系列(4): LinkedList源码深入解析2

發布時間:2025/3/20 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 集合系列(4): LinkedList源码深入解析2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

戳上面的藍字關注我們哦!

?精彩內容?


?

精選java等全套視頻教程

精選java電子圖書

大數據視頻教程精選

java項目練習精選

第4部分 LinkedList遍歷方式

LinkedList遍歷方式

LinkedList支持多種遍歷方式。建議不要采用隨機訪問的方式去遍歷LinkedList,而采用逐個遍歷的方式。
(01) 第一種,通過迭代器遍歷。即通過Iterator去遍歷。

for(Iterator iter = list.iterator(); iter.hasNext();)iter.next();

(02) 通過```訪問遍歷LinkedList

int size = list.size(); for (int i=0; i<size; i++) {list.get(i); ? ? ? ? }

(03) 通過另外一種for循環來遍歷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()) ;// 通過快速隨機訪問遍歷LinkedListiteratorLinkedListThruForeach(getLinkedList()) ;// 通過for循環的變種來訪問遍歷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();// 記錄結束時間long end = System.currentTimeMillis();long interval = end - start;System.out.println("iteratorLinkedListThruIterator:" + interval+" ms");}/*** 通過快速隨機訪問遍歷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); ? ? ? ?}// 記錄結束時間long end = System.currentTimeMillis();long interval = end - start;System.out.println("iteratorLinkedListThruForeach:" + interval+" ms");}/*** 通過另外一種for循環來遍歷LinkedList*/private static void iteratorThroughFor2(LinkedList<Integer> list) {if (list == null)return ;// 記錄開始時間long start = System.currentTimeMillis();for (Integer integ:list) ;// 記錄結束時間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);// 記錄結束時間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);// 記錄結束時間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) {}// 記錄結束時間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) {}// 記錄結束時間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()效率最高。但用它們遍歷時,會刪除原始數據;若單純只讀取,而不刪除,應該使用第3種遍歷方式。
無論如何,千萬不要通過隨機訪問去遍歷LinkedList!

第5部分 LinkedList示例

下面通過一個示例來學習如何使用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當作 LIFO(后進先出)的堆棧useLinkedListAsLIFO();// 將LinkedList當作 FIFO(先進先出)的隊列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個元素設置300。不建議在LinkedList中使用此操作,因為效率低!llist.set(2, "300");// 獲取第3個元素。不建議在LinkedList中使用此操作,因為效率低!System.out.println("\nget(3):"+llist.get(2));// ---- toArray(T[] a) ----// 將LinkedList轉行為數組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當作 LIFO(后進先出)的堆棧*/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當作 FIFO(先進先出)的隊列*/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);} }

運行結果:

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]

回復以下關鍵字獲取更多學習資源

java基礎|html5|css|js|jquery|angularJs|ajax|node.js|javaEE基礎| |struts2|hibernate|spring|svn|maven|springmvc|mybatis|linux|oracle| |luncene|solr|redis|springboot|架構師資源|dubbo|php|webservice|c++基礎|nginx|mysql|sqlserver|asp.net|大數據|java項目

更多學習資源逐步更新,請置頂公眾號不要錯過更新

好好學java

每日推送java優質文章、視頻教程、熱點資訊

微信ID:sihailoveyan

長按左側二維碼關注


總結

以上是生活随笔為你收集整理的Java 集合系列(4): LinkedList源码深入解析2的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。