Java集合02----LinkedList的遍历方式及应用

                                          Java集合02----LinkedList的遍历方式及应用

前面已经学习了ArrayList的源码,为了学以致用,故列举一些ArrayList的遍历方式及应用。JDK源码学习系列05----LinkedList

1.LinkedList的遍历方式

a.一般的for循环(随机访问)

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

b.for--each循环

for (Integer integ:list)
    ;

c.迭代器iterator

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

d.用pollFirst()来遍历LinkedList

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

e.用pollLast()来遍历LinkedList

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

f.用removeFirst()来遍历LinkedList

try {
    while(list.removeFirst() != null)
        ;
} catch (NoSuchElementException e) {
}

g.用removeLast()来遍历LinkedList

try {
    while(list.removeLast() != null)
        ;
} catch (NoSuchElementException e) {
}

LinkedList遍历效率分析:

package com.sheepmu;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.NoSuchElementException;

/*
 * @author SheepMu
 */
public class LinkedListTest {
    public static void main(String[] args) {
    	LinkedList<Integer> llist = new LinkedList<Integer>();
        for (int i=0; i<100000; i++)
            llist.addLast(i);

        byCommonFor(llist) ;// 通过一般for循环来遍历LinkedList
        byForEach(llist) ;  // 通过for-each来遍历LinkedList
        byIterator(llist) ; // 通过Iterator来遍历LinkedList
        byPollFirst(llist) ;    // 通过PollFirst()遍历LinkedList
        byPollLast(llist) ; // 通过PollLast()遍历LinkedList
        byRemoveFirst(llist) ;   // 通过removeFirst()遍历LinkedList
        byRemoveLast(llist) ; // 通过removeLast()遍历LinkedList
    }

    private static void byCommonFor(LinkedList<Integer> list) {// 通过一般for循环来遍历LinkedList
        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 total = end - start;
        System.out.println("byCommonFor------->" + total+" ms");
    }

    private static void byForEach(LinkedList<Integer> list) {// 通过for-each来遍历LinkedList
        if (list == null)
            return ;
        long start = System.currentTimeMillis();
        for (Integer integ:list)
            ;
        long end = System.currentTimeMillis();
        long total = end - start;
        System.out.println("byForEach------->" + total+" ms");
    }

    private static void byIterator(LinkedList<Integer> list) {// 通过Iterator来遍历LinkedList
        if (list == null)
            return ;
        long start = System.currentTimeMillis();
        for(Iterator iter = list.iterator(); iter.hasNext();)
            iter.next();
        long end = System.currentTimeMillis();
        long total = end - start;
        System.out.println("byIterator------->" + total+" ms");
    }

    private static void byPollFirst(LinkedList<Integer> list) {//通过PollFirst()遍历LinkedList
        if (list == null)
            return ;
        long start = System.currentTimeMillis();
        while(list.pollFirst() != null)
            ;
        long end = System.currentTimeMillis();
        long total = end - start;
        System.out.println("byPollFirst------->" + total+" ms");
    }

    private static void byPollLast(LinkedList<Integer> list) {// 通过PollLast()遍历LinkedList
        if (list == null)
            return ;
        long start = System.currentTimeMillis();
        while(list.pollLast() != null)
            ;
        long end = System.currentTimeMillis();
        long total = end - start;
        System.out.println("byPollLast------->" + total+" ms");
    }

    private static void byRemoveFirst(LinkedList<Integer> list) {// 通过removeFirst()遍历LinkedList
        if (list == null)
            return ;
        long start = System.currentTimeMillis();
        try {
            while(list.removeFirst() != null)
                ;
        } catch (NoSuchElementException e) {
        }
        long end = System.currentTimeMillis();
        long total = end - start;
        System.out.println("byRemoveFirst------->" + total+" ms");
    }

    private static void byRemoveLast(LinkedList<Integer> list) {// 通过removeLast()遍历LinkedList
        if (list == null)
            return ;
        long start = System.currentTimeMillis();
        try {
            while(list.removeLast() != null)
                ;
        } catch (NoSuchElementException e) {
        }
        long end = System.currentTimeMillis();
        long total = end - start;
        System.out.println("byRemoveLast------->" + total+" ms");
    }

}

byCommonFor------->5342 ms

byForEach------->11 ms

byIterator------->8 ms

byPollFirst------->4 ms

byPollLast------->0 ms

byRemoveFirst------->0 ms

byRemoveLast------->0 ms

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

2.LinkedList应用举例

a.LinkedList常用方法举例

package com.sheepmu;
import java.util.LinkedList;
/*
 * @author SheepMu
 */
public class LinkedListTest {
    public static void main(String[] args) {
    	commonMethods() ; // 测试LinkedList的常用方法
    	likeStack();// 将LinkedList当作 LIFO(后进先出)的堆栈
    	likeQueue(); // 将LinkedList当作 FIFO(先进先出)的队列
    }

    private static void commonMethods() {
        LinkedList<String> llist = new LinkedList<String>();
        llist.add("A");//添加元素
        llist.add("B");
        llist.add("C");
        llist.add("D");
        System.out.println("llist------->"+llist);
        llist.add(1, "E");// 将“E”添加到第索引为1的个位置
        System.out.println("添加E到索引为1的个位置后的llist------->"+llist);

        llist.addFirst("X");//  将“X”添加到第一个位置。  失败的话,抛出异常!
        System.out.println("在最前面添加X后的llist------->"+llist);
        System.out.println("删除第一个元素并获得并返回被删除元素----->"+llist.removeFirst());  // 将第一个元素删除。
        System.out.println("删除第一个元素后的llist------->"+llist); 

        llist.offerFirst("Y");// 将“Y”添加到第一个位置。  返回true。
        System.out.println("将Y添加到第一个位置后的llist------->"+llist);
        System.out.println("删除第一个元素并获得并返回被删除元素------>"+llist.pollFirst()); // 将第一个元素删除。
        System.out.println("将第一个元素删除后的llist------->"+llist);
        llist.removeLast() ;
        System.out.println("移除最后一个元素后的llist------->"+llist); 

        llist.offerLast("Z"); //   将“Z”添加到最后一个位置
        System.out.println("在最后添加Z后的llist------->"+llist);
        llist.set(2, "M");// 将第3个元素设置M。
        System.out.println("将第3个元素设置M后的llist------->"+llist);
        System.out.println("size:"+llist.size());// LinkedList大小
        llist.clear();// 清空LinkedList
    }

    private static void likeStack() { //将LinkedList作为栈使用!!!!!!!!!!!!
        LinkedList<String> stack = new LinkedList<String>();
        stack.push("A");//向栈中添加元素
        stack.push("B");
        stack.push("C");
        stack.push("D");
        System.out.println("stack--------->"+stack);
        stack.pop() ;// 删除“栈顶元素”
        System.out.println("删除栈顶后的stack--------->"+stack);
        System.out.println("栈顶元素--------->"+stack.peek()); // 取出栈顶

    }

    private static void likeQueue() {//将LinkedList作为队列使用!!!!!!!!!!!!
        LinkedList<String> queue = new LinkedList<String>();
        queue.add("A");//向队列中添加元素
        queue.add("B");
        queue.add("C");
        queue.add("D");
        System.out.println("queue--------->"+queue);
        queue.remove() ;//删除队列的第一个元素
        System.out.println("删除队列的第一个元素后queue--------->"+queue);
        System.out.println("队列第一个元素------->"+queue.element()); // 读取队列的第一个元素 

    }
}

llist------->[A, B, C, D]

添加E到索引为1的个位置后的llist------->[A, E, B, C, D]

在最前面添加X后的llist------->[X, A, E, B, C, D]

删除第一个元素并获得并返回被删除元素----->X

删除第一个元素后的llist------->[A, E, B, C, D]

将Y添加到第一个位置后的llist------->[Y, A, E, B, C, D]

删除第一个元素并获得并返回被删除元素------>Y

将第一个元素删除后的llist------->[A, E, B, C, D]

移除最后一个元素后的llist------->[A, E, B, C]

在最后添加Z后的llist------->[A, E, B, C, Z]

将第3个元素设置M后的llist------->[A, E, M, C, Z]

size:5

stack--------->[D, C, B, A]

删除栈顶后的stack--------->[C, B, A]

栈顶元素--------->C

queue--------->[A, B, C, D]

删除队列的第一个元素后queue--------->[B, C, D]

队列第一个元素------->B

Java集合02----LinkedList的遍历方式及应用

时间: 2024-08-02 03:38:13

Java集合02----LinkedList的遍历方式及应用的相关文章

Java实现二叉树及相关遍历方式

Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查找树和二叉堆. 下面用Java实现对二叉树的先序遍历,中序遍历,后序遍历.广度优先遍历.深度优先遍历.转摘请注明:http://blog.csdn.net/qiuzhping/article/details/44830369 package com.qiuz

List集合中两种遍历方式

遍历List集合中的元素的方法有两种: 第一种:利用迭代器遍历 代码1: // 迭代器 Iterator it=list.iterator(); while(it.hasNext()) { System.out.println(it.next()); } 或者代码2: for(Iterator it=list.iterator();it.hasNext();) { System.out.println(it.next()); }// 与while循环相比优点:对象it在循环结束后,变为垃圾,自动

java中ArrayList集合的三种遍历方式

public class ListDemo { public static void main(String[] args) { ArrayList<String> mList = new ArrayList<>(); mList.add("郭靖"); mList.add("黄蓉"); mList.add("洪七公"); mList.add("周伯通"); // 第一种遍历方式:普通for循环 for

Java集合四LinkedList

LinkedList简介 继承于AbstractSequentialList的双向链表,可以被当做堆栈.队列或双端队列进行操作. LinkedList本质上是一个双向链表,实现了Dequeue接口. LinkedList包含两个重要的成员:header和size. header是双向链表的表头,它是双向链表节点所对应的类Node的实例.Node中包含成员变量:prev.next.item.其中prev是该节点的上一个节点,next是该节点的下一个节点,item是该节点所包含的值. private

死磕 java集合之LinkedList源码分析

问题 (1)LinkedList只是一个List吗? (2)LinkedList还有其它什么特性吗? (3)LinkedList为啥经常拿出来跟ArrayList比较? (4)我为什么把LinkedList放在最后一章来讲? 简介 LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用,它是怎么实现的呢?让我们一起来学习吧. 继承体系 通过继承体系,我们可以看到LinkedList不仅实现了List接口,还实现了Queue和Deque接口,所以它既

Map集合的两种遍历方式

Map集合:即 接口Map<K,V> map集合的两种取出方式:    1.Set<k> keyset: 将map中所有的键存入到set集合(即将所有的key值存入到set中), 因为Set具备迭代器,可以进行迭代遍历. 所有可以迭代方式取出所有的链,再根据get方法.获取每一个键对应的值. Map 集合的取出原理: 将map集合转成set集合. 再通过迭代器取出    2. set<Map.Entry<k,v>>  entrySet: 将map集合中的映射

集合的两种遍历方式

① import java.util.ArrayList;import java.util.List; /* * List集合的特有遍历功能: *   size()和get()方法结合使用 */public class ListDemo2 { public static void main(String[] args) {  // 创建集合对象  List list = new ArrayList(); // 添加元素  list.add("hello");  list.add(&qu

Java—集合02

1.Iterator迭代器 Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来.一直把集合中的所有元素全部取出.这种取出方式专业术语称为迭代. 集合中把这种取元素的方式描述在Iterator接口中.  常用的方法:   判断集合中是否有下一个元素可以替代,如果可以替代则返回true:hasNext() / boolean;   返回迭代的下一个元素并把指针向下移一位:naxt() / E;   Colle

java集合-LinkedList

LinkedList概念与简单实例 LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用. 1:LinkedList提供了4个不同位置的添加数据的方法,分别为链头插入,链尾插入,节点前插入,节点后插入 2:由于LinkedList是双向链表,在查询数据方面提供了"从前往后"和"从后往前"两个查询方法 3:如果数据量大,删除频繁,只能用LinkedList. 特别注意: list.get(i),LinkedList的底层是一个链表,随机

Map集合的几种遍历方式

Map<String ,String> map=new HashMap<String,String>(); map.put("1","value1"); map.put("2","value2"); map.put("3","value3"); //第一种遍历方式: for(String key:map.keySet()){ String key=key; Str