LinkedList 的全面說明
- LinkList底層實現了雙向鏈表和雙端隊列特點
- 可以添加任意元素(元素可以重復),包括null
- 線程不安全,沒有實現同步
LinkedList 的底層操作機制
- LinkedList底層維護了一個雙向鏈表
- LinkList中維護了兩個屬性first和last分別指向 首節點和尾結點
- 每個節點(Node對象),里面有維護了prev、next、item三個屬性
prev:指向前一個
next:指向后一個
最終實現雙向鏈表 - ListedList的元素的添加和刪除,不是通過數組完成的,相對來說效率高
- 模擬一個簡單的雙向鏈表-代碼:
public class LinkedList_ {public static void main(String[] args) {//模擬一個簡單的雙向鏈表//1,創建Node對象Node jack = new Node("jack");Node tom = new Node("tom");Node zl = new Node("zl");//2,連接3個結點,形成雙向鏈表// jack -> tom -> zljack.next = tom;tom.next = zl;// zl -> tom -> jackzl.pre = tom;tom.pre = jack;//3,指定雙向鏈表的頭節點-jack;尾結點-zlNode first = jack;Node last = zl;//4,從頭到尾遍歷System.out.println("=======從頭到尾遍歷===========");while (true){if (first == null){break;}System.out.println(first);first = first.next;}//5,從尾到頭遍歷System.out.println("=====從尾到頭遍歷======");while (true){if (last==null){break;}System.out.println(last);last=last.pre;}//6,添加對象/數據System.out.println("======添加數據后======");Node add1 = new Node("add1");//添加到jack 和 tom 中間add1.next = tom;add1.pre=jack;tom.pre=add1;jack.next=add1;first = jack;while (true){if (first == null){break;}System.out.println(first);first = first.next;}System.out.println("=======添加數組后從后往前遍歷=========");last=zl;while (true){if (last==null){break;}System.out.println(last);last=last.pre;}}
}//定義一個Node類,Node對象,表示雙向鏈表的一個節點
class Node {public Object item;//真正存放數據public Node next;//指向后一個結點public Node pre;//指向前一個節點public Node(Object item) {this.item = item;}@Overridepublic String toString() {return "Node{" +"item=" + item +'}';}
}
結果
LinkedList的增刪改查案例
public class LinkedListCRUD {@SuppressWarnings({"all"})public static void main(String[] args) {LinkedList linkedList = new LinkedList();linkedList.add(1);linkedList.add(2);linkedList.add(3);System.out.println("linkedList=" + linkedList);//刪除節點
// linkedList.remove(); // 這里默認刪除的是第一個結點linkedList.remove(1);System.out.println("刪除后linkedList="+ linkedList);//修改某個節點 將index=1位置的對象修改為999linkedList.set(1,999);System.out.println("修改后的linkedList"+linkedList);//得到某個節點System.out.println("得到下標為1的對象"+linkedList.get(1));//遍歷方式,因為LinkedList 是實現了 List接口,因此遍歷方式為List的三個遍歷方式System.out.println("===LinkeList 遍歷迭代器====");Iterator iterator = linkedList.iterator();while (iterator.hasNext()) {Object next = iterator.next();System.out.println(next);}System.out.println("===LinkeList 遍歷增強 for====");for (Object o:linkedList){System.out.println(o);}System.out.println("===LinkeList 遍歷普通 for====");for (int i = 0; i < linkedList.size(); i++) {System.out.println(linkedList.get(i));}}}
結果
ArrayList 和 LinkedList 的比較
LinkedList的增刪改查
- 增:1,創建結點對象;2,通過鏈表追加前后連接;3,遍歷
- 刪: linkedList.remove(); // 這里默認刪除的是第一個結點
- 改:linkedList.set(1,999); 將index=1位置的對象修改為999
- 查:三種方式遍歷:1,遍歷迭代器;2,遍歷增強for;3,遍歷普通for
ArrayList的增刪改查
- 增:擴容,創建新數組,復制,比較麻煩
- 刪:創建新數組,復制,比較麻煩
- 改:數組名[下標] 直接修改
- 查:for循環遍歷