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