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():1Test "offerFirst(), pollFirst(), peekFirst()"
llist:[10, 1, 4, 2, 3]
llist.pollFirst():10
llist:[1, 4, 2, 3]
llist.peekFirst():1Test "addLast(), removeLast(), getLast()"
llist:[1, 4, 2, 3, 20]
llist.removeLast():20
llist:[1, 4, 2, 3]
llist.getLast():3Test "offerLast(), pollLast(), peekLast()"
llist:[1, 4, 2, 3, 20]
llist.pollLast():20
llist:[1, 4, 2, 3]
llist.peekLast():3get(3):300
str:1
str:4
str:300
str:3
size:4
isEmpty():trueuseLinkedListAsLIFO
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相关推荐
- Java 集合系列:Vector源码深入解析
概论 学完ArrayList和LinkedList之后,我们接着学习Vector.学习方式还是和之前一样,先对Vector有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. 第1部分 Ve ...
- Java集合(二二): LinkedList源码剖析
目录 1.LinkedList简介 2.LinkedList数据结构 3.ArrayList源码分析LinkedList3.ArrayList源码分析 3.1 ArrayList继承结构和层次关系Li ...
- Java集合篇:LinkedList源码分析
(注:本文内容基于JDK1.6) 一.概述: LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是List接口 ...
- 死磕 java同步系列之ReentrantReadWriteLock源码解析
问题 (1)读写锁是什么? (2)读写锁具有哪些特性? (3)ReentrantReadWriteLock是怎么实现读写锁的? (4)如何使用ReentrantReadWriteLock实现高效安全的 ...
- Java 集合系列(4): LinkedList源码深入解析1
戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 概要 前面,我们已经学习了ArrayList,并了解了fail-fast ...
- Java集合专题(含源码)
Java集合专题 一.集合是什么? 1.集合和数组的区别 2.Collection体系的继承树 2.1 Collection接口常用方法 2.2 Collection常用遍历方式 2.2.1 迭代器I ...
- Java类集框架 —— LinkedList源码分析
在JDK1.7之前,LinkedList是采用双向环形链表来实现的,在1.7及之后,Oracle将LinkedList做了优化,将环形链表改成了线性链表.本文对于LinkedList的源码分析基于JD ...
- Java多线程系列(十):源码剖析AQS的实现原理
在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS. 本篇主要通过对AQS的实现原理.数据模型.资源共享方式.获取锁的过程, ...
- java condition_死磕 java同步系列之ReentrantLock源码解析(二)
(手机横屏看源码更方便) 问题 (1)条件锁是什么? (2)条件锁适用于什么场景? (3)条件锁的await()是在其它线程signal()的时候唤醒的吗? 简介 条件锁,是指在获取锁之后发现当前业务 ...
最新文章
- YSLOW法则中,为什么yahoo推荐用GET代替POST?
- Android 实现微信QQ分享以及第三方登录
- 基于发电厂知识问答库的检索式问答系统(python有代码)
- MSF(二):msf外部/内部常用命令
- haproxy代理设置及配置文件详解
- [css] 说下background-color:transparent和opacity:0的区别是什么?
- fir fpga 不同截止频率_一种新的FIR滤波器系数量化方法
- KMP算法(待优化)--2015年7月25日14:04:25V1.0版
- 响应式网站导航html,jQuery和CSS3响应式网站导航幻灯片插件
- php图书借阅管理系统前台,php图书馆图书借阅管理系统
- 计算机一级ps怎么保存,2017年计算机等考一级PS辅导:PS图像格式详细解说
- Burpsuite1.7.03网站渗透神器最新破解版
- 二元最佳前缀码_信息与编码系列(二)最优码——Huffman码
- 因特尔Edison第2站--mraa下gpio
- A Survey on Deep Learning Techniques for Stereo-based Depth Estimation论文阅读
- 物理-三菱镜-三菱镜效应:三菱镜效应 百科
- 职业也如学习一样,逆水行舟不进则退
- 一文带你读懂“TRIZ”
- 东周科目三考场5号线_深圳东周科目三考场路线及注意事项
- 傲视天地 页游 一键端 自玩
热门文章
- JavaScript与Asp.net传值
- SUMO 在LINUX 下安装以及环境变量的配置
- CentOS7关闭防火墙和SELinux
- stm8s串口奇偶校验学习笔记
- android enum java包_Android @IntDef注解取代Java enum枚举提高性能详解
- C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和static
- 2019天梯赛(总结-无题解)
- 【Pygame小游戏】这款休闲游戏你肯定了解过《开心消消乐》更新版本上线,好土好喜欢
- 2022-02-07