当前位置:   article > 正文

《知识点020:Java中LinkedList遍历(7种)》_java 链表遍历

java 链表遍历

一、LinkedList类介绍

LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用.,它和ArrayList一样实现了List接口,但是她执行插入和删除操作时比ArrayList更加高效,因为她是基于链表的,但同时也决定了她在随机访问方面要比ArrayList弱一点。

1.1:结构原理

LinkedList底层的数据结构是基于双向循环链表的,且头结点中不存放数据,如下:

既然是双向链表,那么必定存在一种数据结构——我们可以称之为节点,节点实例保存业务数据,前一个节点的位置信息和后一个节点位置信息,如下图所示:


 

1.2:构造方法

  1. public LinkedList() {//生成空的链表
  2. header.next = header.previous = header;
  3. }
  4. public LinkedList(Collection<? extends E> c) {//复制构造函数
  5. this();
  6. addAll(c);
  7. }

第一个构造方法不接受参数,将header实例的previous和next全部指向header实例(注意,这个是一个双向循环链表,如果不是循环链表,空链表的情况应该是header节点的前一节点和后一节点均为null),这样整个链表其实就只有header一个节点,用于表示一个空的链表。执行完构造函数后,header实例自身形成一个闭环,如下图所示:

第二个构造方法接收一个Collection参数c,调用第一个构造方法构造一个空的链表,之后通过addAll将c中的元素全部添加到链表中。

二、LinkedList遍历(7种)

2.1:一般的for循环(随机访问)遍历

  1. int size = list.size();
  2. for (int i=0; i<size; i++) {
  3. list.get(i);
  4. }

2.2:for--each循环遍历

  1. for (Integer integ:list){
  2. ;
  3. }

2.3:迭代器iterator遍历

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

2.4:用pollFirst()遍历

  1. while(list.pollFirst() != null)
  2. ;

2.5:用pollLast()遍历

  1. while(list.pollLast() != null)
  2. ;

2.6:用removeFirst()遍历

  1. try {
  2. while(list.removeFirst() != null)
  3. ;
  4. } catch (NoSuchElementException e) {
  5. }

2.7:用removeLast()遍历

  1. try {
  2. while(list.removeLast() != null)
  3. ;
  4. } catch (NoSuchElementException e) {
  5. }

2.8:实例

  1. public class LinkedListTest {
  2. public static void main(String[] args) {
  3. LinkedList<Integer> llist = new LinkedList<Integer>();
  4. for (int i=0; i<100000; i++)
  5. llist.addLast(i);
  6. byCommonFor(llist) ;// 通过一般for循环来遍历LinkedList
  7. byForEach(llist) ; // 通过for-each来遍历LinkedList
  8. byIterator(llist) ; // 通过Iterator来遍历LinkedList
  9. byPollFirst(llist) ; // 通过PollFirst()遍历LinkedList
  10. byPollLast(llist) ; // 通过PollLast()遍历LinkedList
  11. byRemoveFirst(llist) ; // 通过removeFirst()遍历LinkedList
  12. byRemoveLast(llist) ; // 通过removeLast()遍历LinkedList
  13. }
  14. private static void byCommonFor(LinkedList<Integer> list) {// 通过一般for循环来遍历LinkedList
  15. if (list == null)
  16. return ;
  17. long start = System.currentTimeMillis();
  18. int size = list.size();
  19. for (int i=0; i<size; i++) {
  20. list.get(i);
  21. }
  22. long end = System.currentTimeMillis();
  23. long total = end - start;
  24. System.out.println("byCommonFor------->" + total+" ms");
  25. }
  26. private static void byForEach(LinkedList<Integer> list) {// 通过for-each来遍历LinkedList
  27. if (list == null)
  28. return ;
  29. long start = System.currentTimeMillis();
  30. for (Integer integ:list)
  31. ;
  32. long end = System.currentTimeMillis();
  33. long total = end - start;
  34. System.out.println("byForEach------->" + total+" ms");
  35. }
  36. private static void byIterator(LinkedList<Integer> list) {// 通过Iterator来遍历LinkedList
  37. if (list == null)
  38. return ;
  39. long start = System.currentTimeMillis();
  40. for(Iterator iter = list.iterator(); iter.hasNext();)
  41. iter.next();
  42. long end = System.currentTimeMillis();
  43. long total = end - start;
  44. System.out.println("byIterator------->" + total+" ms");
  45. }
  46. private static void byPollFirst(LinkedList<Integer> list) {//通过PollFirst()遍历LinkedList
  47. if (list == null)
  48. return ;
  49. long start = System.currentTimeMillis();
  50. while(list.pollFirst() != null)
  51. ;
  52. long end = System.currentTimeMillis();
  53. long total = end - start;
  54. System.out.println("byPollFirst------->" + total+" ms");
  55. }
  56. private static void byPollLast(LinkedList<Integer> list) {// 通过PollLast()遍历LinkedList
  57. if (list == null)
  58. return ;
  59. long start = System.currentTimeMillis();
  60. while(list.pollLast() != null)
  61. ;
  62. long end = System.currentTimeMillis();
  63. long total = end - start;
  64. System.out.println("byPollLast------->" + total+" ms");
  65. }
  66. private static void byRemoveFirst(LinkedList<Integer> list) {// 通过removeFirst()遍历LinkedList
  67. if (list == null)
  68. return ;
  69. long start = System.currentTimeMillis();
  70. try {
  71. while(list.removeFirst() != null)
  72. ;
  73. } catch (NoSuchElementException e) {
  74. }
  75. long end = System.currentTimeMillis();
  76. long total = end - start;
  77. System.out.println("byRemoveFirst------->" + total+" ms");
  78. }
  79. private static void byRemoveLast(LinkedList<Integer> list) {// 通过removeLast()遍历LinkedList
  80. if (list == null)
  81. return ;
  82. long start = System.currentTimeMillis();
  83. try {
  84. while(list.removeLast() != null)
  85. ;
  86. } catch (NoSuchElementException e) {
  87. }
  88. long end = System.currentTimeMillis();
  89. long total = end - start;
  90. System.out.println("byRemoveLast------->" + total+" ms");
  91. }
  92. }

运行结果:
由此可见,遍历LinkedList时,使用removeFist()或removeLast()效率最高。但用它们遍历时,会删除原始数据;若单纯只读取,而不删除,LinkedList遍历时建议使用For-each或者迭代器的方式。千万不要通过随机访问去遍历LinkedList!

  1. byCommonFor------->5342 ms
  2. byForEach------->11 ms
  3. byIterator------->8 ms
  4. byPollFirst------->4 ms
  5. byPollLast------->0 ms
  6. byRemoveFirst------->0 ms
  7. byRemoveLast------->0 ms


 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/925562
推荐阅读
相关标签
  

闽ICP备14008679号