物理結構:java
邏輯結構算法
- 線性結構:通常線性表、棧、隊列、字符串、數組、廣義表
- 非線性結構:樹、圖
一、集合命名規則數組
- 命名大致上能夠歸類爲AbEf的形式: Ab表明物理結構,Ef表明邏輯結構
- 如ArrayList,就是用數組實現線性表
- LinkedList就是用鏈表實現的線性表
二、native方法:安全
- arraycopy()@java.lang.System.class
- 將src中的srcPos~srcPos+length-1的數據複製到dest中的destPos~destPos+length-1位置處
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
三、順序存儲結構:ui
(1)線性表&棧線程
ArrayList:指針
- 內部存儲了一個Object[]
- 提供隨機訪問
- ArrayList中數據的移動大可能是利用System.arraycopy()方法實現,該方法是native方法;
- 擴容;
- 默認大小是10;
- 最大容量Integer.MAX_VALUE - 8;
- 擴容觸發條件:當前要求容量大小大於當前容量大小
- 正常擴容newCapacity = oldCapacity + (oldCapacity >> 1);
- 使用System.arraycopy將數據所有移動到新的數組中
- 縮容:手動調用trimToSize()方法,會縮到當前數組實際存儲的數據大小
Vector:code
- Vector與ArrayList共同點
- 二者實現的功能相同,方法的實現也基本一致;
- 都具備SubList內部類和Itr迭代器內部類
- 都可以擴容和縮容
- Vector與ArrayList區別:
- 線程安全:Vector對大部分的方法使用了關鍵字Synchronized聲明
- 額外的%element%方法:這些方法會被Stack類所使用;
Stack:對象
- Stack主要使用的是Vector<E>的方法進行具體的實現,自身沒有狀態量
- 線程安全:繼承Vector,故也是線程安全的
- pop方法:使用elementAt+removeElementAt
- push方法:使用addElement
- search方法:從後往前搜索調用lastIndexOf
(2)隊列繼承
ArrayDeque:
- 存儲有一個Obejct[]數組;數組長度必須是2的冪次,由於這樣就方便取餘運算;
- 有一個head和tail指針;
- tail =(tail+1)&(elements.length-1)
- head =(head+1)&(elements.length-1)
- size = (tail-head)&(elements.length-1)
- 擴容:
- 正常擴容後大小爲原數組長度2倍
- 利用System.arraycopy方法實現
PriorityQueue:
- 類中存儲有一個Object[]數組
- size爲當前數組中存儲的數據的大小
- 存入的數據類型要求實現了Comparable接口
- 數據的添加和刪除操做伴隨着調堆的操做;
- 具備擴容功能:
- 擴容大小:當前大小的2倍或者1.5倍
- 擴容條件:準備存入的數據量大於當前Obejct數組的長度;
(3)Map
HashMap:
- 內部存儲了一個Node<K,V>[] table;
- 內部有定義一個Node內部類和TreeNode內部類
- 後者是一顆紅黑樹
- 數組的下標(散列值)等於hash(key)&n-1
- 會自動擴容:
- 默認大小是16;大小必須爲2的冪
- 最大容量是1<<30
- 填裝因子爲0.75
- 擴容觸發條件:一旦當前存儲數據大於門限(容量*填裝因子)
- 正常擴容newCapacity = oldCapacity<<1
- 每一個桶中的數據分紅兩撥一波繼續留在原散列值下面
- 另外一波移動到原散列值+oldCapacity位置處
- 不能自動減容
- 紅黑樹的利用:
- 桶中的元素大於某個固定值,則將該桶中的數據由鏈表存儲結構,轉換成紅黑樹存儲結構
- 在此以後的全部操做交由紅黑樹進行處理
- 在擴容的時候,對紅黑樹進行拆分的過程當中
- 若是最後元素個數小於固定值,則將紅黑樹存儲結構轉換爲普通鏈表存儲結構
HashTable:
- 基本與HashMap相似;
- 線程安全:HashTable的大部分方法使用了Synchronized關鍵字進行標記
- 沒有紅黑樹:HashTable對桶中數據的存儲沒有使用紅黑樹,所以效率相對於hashmap會差一點
- 不支持存儲null:會拋出異常
HashSet:
- 內部存儲了一個HashMap<E,Object>變量
- 一個簡單版本的HashMap
- 只使用了key而沒有使用value部分,value永遠存的都是固定的Object
(4)String
String
- 內部存儲的是一個final char[]字符數組;
- 所以不能修改它指向的字符數組
StringBuidler
- 內部存儲的是一個char[]字符數組
- 所以能夠修改裏面的字符
- 對於數組的拷貝大多依賴於System.arraycopy的方法
- 擴容
- 默認大小爲16
- 容量最大值:Integer.MAX_VALUE
- 正常狀況擴容大小:int newCapacity = value.length * 2 + 2;
- 擴容觸發條件:準備存儲的字符數大於當前數組的長度
- 縮容:
StringBuffer
- 與Stringbuilder相似
- 線程安全:方法大多使用了Synchronized關鍵字標記
四、鏈式存儲結構
TreeMap:
- 定義了一個內部類Entry<K,V>
- 該節點定義了這課紅黑樹的存儲結構
- 存儲有該樹的根節點
- 要刪除這顆樹只須要將root指向null便可
- GC以後便會回收該紅黑樹,形成其它節點的引用不可達
- 每次插入、刪除一個樹中節點時
- 都須要對這顆紅黑樹進行必定的調整
TreeSet:
- 內部存儲了一個TreeSet<E,Object>對象
- 一個簡單版本的TreeMap
- 只使用了key而沒有使用value部分,value永遠存的都是固定的Object
LinkedList:
- 內部存儲一個雙向鏈表
- 全部的操做都是對該鏈表進行操做
LinkedHashMap:
- 數據存儲是HashMap只是有在其上面加了一個鏈表結構
- 每次對該HashMap中的數訪問一次都會改變鏈表結構
- 保證鏈表中的最後面的數據是最近剛被訪問的那個節點的數據
- 具備LRU算法特性(Least recently used,最近最少使用)