代碼詳解のLinkedList原碼分析和ArrayList比較

package com.sdmjhca.springBootDemo.collections;

import java.util.LinkedList;

/**
 * @author JHMI on 2017/8/22.jdk1,8
 * 通過跟蹤分析源碼不難發現LinkedList的存儲結構是雙向鏈表
 * 存儲的內容爲 previous(前一個單元的地址) item(當前元素的內容) next(下一個單元的地址)
 * 1LinkedListget方法 是通過判斷當前的索引和size的一半比較,如果小於,則從前一半數據開始遍歷;如果大於,則從後一半數據倒序遍歷;所以使用for循環遍歷會很慢
 * 2、而通過foreach是通過LinkedListIterator進行遍歷,只需要初始化表頭後,通過節點的next進行向下查找(即通過地址進行遍歷)
 * 3LinkedListadd("asd")方法是直接向鏈表的末尾添加一個節點;add(0,"0")方法同get方法一樣向前或向後遍歷
 * 4linkedList.remove(0);//需要向前或向後遍歷鏈表,然後修改前一個節點的next和後一個節點的previous
 * 5linkedList.remove("123");//直接從頭開始遍歷鏈表如果item相同則找到,所以如果有多個相同的item 先刪除的是最先add *
 * 6、總結linkedListarraylistaddremove方法
 * 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章