戳上面的蓝字关注我们哦!

精彩内容

精选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相关推荐

  1. Java 集合系列:Vector源码深入解析

    概论 学完ArrayList和LinkedList之后,我们接着学习Vector.学习方式还是和之前一样,先对Vector有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. 第1部分 Ve ...

  2. Java集合(二二): LinkedList源码剖析

    目录 1.LinkedList简介 2.LinkedList数据结构 3.ArrayList源码分析LinkedList3.ArrayList源码分析 3.1 ArrayList继承结构和层次关系Li ...

  3. Java集合篇:LinkedList源码分析

    (注:本文内容基于JDK1.6) 一.概述: LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是List接口 ...

  4. 死磕 java同步系列之ReentrantReadWriteLock源码解析

    问题 (1)读写锁是什么? (2)读写锁具有哪些特性? (3)ReentrantReadWriteLock是怎么实现读写锁的? (4)如何使用ReentrantReadWriteLock实现高效安全的 ...

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

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 概要 前面,我们已经学习了ArrayList,并了解了fail-fast ...

  6. Java集合专题(含源码)

    Java集合专题 一.集合是什么? 1.集合和数组的区别 2.Collection体系的继承树 2.1 Collection接口常用方法 2.2 Collection常用遍历方式 2.2.1 迭代器I ...

  7. Java类集框架 —— LinkedList源码分析

    在JDK1.7之前,LinkedList是采用双向环形链表来实现的,在1.7及之后,Oracle将LinkedList做了优化,将环形链表改成了线性链表.本文对于LinkedList的源码分析基于JD ...

  8. Java多线程系列(十):源码剖析AQS的实现原理

    在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS. 本篇主要通过对AQS的实现原理.数据模型.资源共享方式.获取锁的过程, ...

  9. java condition_死磕 java同步系列之ReentrantLock源码解析(二)

    (手机横屏看源码更方便) 问题 (1)条件锁是什么? (2)条件锁适用于什么场景? (3)条件锁的await()是在其它线程signal()的时候唤醒的吗? 简介 条件锁,是指在获取锁之后发现当前业务 ...

最新文章

  1. YSLOW法则中,为什么yahoo推荐用GET代替POST?
  2. Android 实现微信QQ分享以及第三方登录
  3. 基于发电厂知识问答库的检索式问答系统(python有代码)
  4. MSF(二):msf外部/内部常用命令
  5. haproxy代理设置及配置文件详解
  6. [css] 说下background-color:transparent和opacity:0的区别是什么?
  7. fir fpga 不同截止频率_一种新的FIR滤波器系数量化方法
  8. KMP算法(待优化)--2015年7月25日14:04:25V1.0版
  9. 响应式网站导航html,jQuery和CSS3响应式网站导航幻灯片插件
  10. php图书借阅管理系统前台,php图书馆图书借阅管理系统
  11. 计算机一级ps怎么保存,2017年计算机等考一级PS辅导:PS图像格式详细解说
  12. Burpsuite1.7.03网站渗透神器最新破解版
  13. 二元最佳前缀码_信息与编码系列(二)最优码——Huffman码
  14. 因特尔Edison第2站--mraa下gpio
  15. A Survey on Deep Learning Techniques for Stereo-based Depth Estimation论文阅读
  16. 物理-三菱镜-三菱镜效应:三菱镜效应 百科
  17. 职业也如学习一样,逆水行舟不进则退
  18. 一文带你读懂“TRIZ”
  19. 东周科目三考场5号线_深圳东周科目三考场路线及注意事项
  20. 傲视天地 页游 一键端 自玩

热门文章

  1. JavaScript与Asp.net传值
  2. SUMO 在LINUX 下安装以及环境变量的配置
  3. CentOS7关闭防火墙和SELinux
  4. stm8s串口奇偶校验学习笔记
  5. android enum java包_Android @IntDef注解取代Java enum枚举提高性能详解
  6. C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配
  7. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和static
  8. 2019天梯赛(总结-无题解)
  9. 【Pygame小游戏】这款休闲游戏你肯定了解过《开心消消乐》更新版本上线,好土好喜欢
  10. 2022-02-07