1. 程式人生 > >ArrayList、LinkedList的資料儲存原理

ArrayList、LinkedList的資料儲存原理

ArrayList:原始碼定義了一個數組transient Object[] elementData;(在實際開發過程中,我們常常會遇到這樣的問題,這個類的有些屬性需要序列化,而其他屬性不需要被序列化,打個比方,如果一個使用者有一些敏感資訊(如密碼,銀行卡號等),為了安全起見,不希望在網路操作(主要涉及到序列化操作,本地序列化快取也適用)中被傳輸,這些資訊對應的變數就可以加上transient關鍵字。換句話說,這個欄位的生命週期僅存於呼叫者的記憶體中而不會寫到磁盤裡持久化。總之,java 的transient關鍵字為我們提供了便利,你只需要實現Serilizable介面,將不需要序列化的屬性前新增關鍵字transient,序列化物件的時候,這個屬性就不會序列化到指定的目的地中。然後直接新增元素。public boolean add(E e) {ensureCapacityInternal(size + 1); // Increments modCount!!elementData[size++] = e;return true;}刪除元素,直接進行陣列操作。remove(index),remove(element)LinkedList:底層原始碼定義一個雙向連結串列private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}}定義了兩種新增元素方式:1.在連結串列頭部新增元素private void linkFirst(E e) {final Node<E> f = first;final Node<E> newNode = new Node<>(null, e, f);first = newNode;if (f == null)last = newNode;elsef.prev = newNode;size++;modCount++;}2.在連結串列尾部新增元素:void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null)first = newNode;elsel.next = newNode;size++;modCount++;}其中新增元素方法:add(),addFirst(),呼叫linkFirst()方法,直接在頭部新增元素add(index,element),在指定位置新增元素,通過size鎖定位置,然後在其前部新增push(),offerFrist()呼叫addFirst,模擬棧功能,在隊頭插入offer(),offerLast()呼叫addList,模擬佇列功能,在隊尾插入-----------------------------------------------------------------刪除元素:原始碼定義了2中刪除元素的方法:1.刪除連結串列頭部元素private E unlinkFirst(Node<E> f) {// assert f == first && f != null;final E element = f.item;final Node<E> next = f.next;f.item = null;f.next = null; // help GCfirst = next;if (next == null)last = null;elsenext.prev = null;size--;modCount++;return element;}2.刪除連結串列尾部元素private E unlinkLast(Node<E> l) {// assert l == last && l != null;final E element = l.item;final Node<E> prev = l.prev;l.item = null;l.prev = null; // help GClast = prev;if (prev == null)first = null;elseprev.next = null;size--;modCount++;return element;}其中刪除元素的方法:remove()、removeFirst()、pop()、poll()、pollFirst()都是呼叫的unlinkFirst()方法removeList()、pollLast()都是呼叫unlinkLast的方法。push()和pop()是模擬棧儲存。先進後出(FILO),在頭部操作
offer()和poll()是模擬佇列儲存,先進先出(FIFO),在尾部進隊,頭部出隊操作offerFirst()、offerLast()和pollFirst()、pollLast()模擬雙向佇列,在尾部可以進隊出隊,在頭部可以進隊出隊