package com.sdmjhca.springBootDemo.collections; import java.util.LinkedList; /** * @author JHMI on 2017/8/22.jdk1,8 * 通過跟蹤分析源碼不難發現LinkedList的存儲結構是雙向鏈表 * 存儲的內容爲 previous(前一個單元的地址) item(當前元素的內容) next(下一個單元的地址) * 1、LinkedList的get方法 是通過判斷當前的索引和size的一半比較,如果小於,則從前一半數據開始遍歷;如果大於,則從後一半數據倒序遍歷;所以使用for循環遍歷會很慢 * 2、而通過foreach是通過LinkedList的Iterator進行遍歷,只需要初始化表頭後,通過節點的next進行向下查找(即通過地址進行遍歷) * 3、LinkedList的add("asd")方法是直接向鏈表的末尾添加一個節點;add(0,"0")方法同get方法一樣向前或向後遍歷 * 4、linkedList.remove(0);//需要向前或向後遍歷鏈表,然後修改前一個節點的next和後一個節點的previous * 5、linkedList.remove("123");//直接從頭開始遍歷鏈表如果item相同則找到,所以如果有多個相同的item 先刪除的是最先add的 * * 6、總結linkedList和arraylist的add和remove方法 * linkedList的尋址比較慢需要遍歷鏈表,但是新增和刪除操作較快只需變更前後節點的地址 * arraylist的尋址比較快只需通過數組下標定位元素,但是新增和刪除比較慢,需要拷貝數組的元素 */ public class LinkedListTest { public static void main(String[] args) { LinkedList linkedList = new LinkedList(); linkedList.add("asd"); linkedList.add(0,"0"); linkedList.add(1,"1"); linkedList.add(3,"3"); linkedList.get(0); linkedList.remove(0);//需要向前或向後遍歷鏈表 linkedList.remove("123");//直接從頭開始遍歷鏈表如果item相同則找到,所以如果有多個相同的item 先刪除的是最先add的 System.out.println("----"); for (Object s: linkedList ){ System.out.println(s); } } }
更多內容可以參考:http://www.cnblogs.com/xrq730/p/5005347.html