菜鳥拙見,望請糾正:附上JDK參考文檔:連結:pan.baidu.com/s/1eLqG4eTXYSTY1-IxMQqA4Q 密碼:33x0 以及演算法篇全文連結 www.cnblogs.com/nullering/p/9536339.html
一:前言
說完了資料結構的基礎認知,我想扯一個外傳——Java的集合。Java的集合只是一些能夠盛放對象的容器,而這些容器的實現,則是用了不同的資料結構,我們在使用Java語言時,這些集合類就是我們最好的工具。
,這是Java的集合的抽象類別和具體的實作類別,抽象介面類不能執行個體化,必須由具體實作類別進行執行個體化操作。
二:List介面及其實作類別ArrayList
List是元素有序並且可以重複的集合,被稱為序列
List可以精確的控制每個元素的插入位置,或刪除某個位置元素
基本操作:
(1)、添加
void add(int Index , E element):在list的指定位置插入元素
void addAll(int index , Collection<? Extends E> e):將指定collection中的所有元素插入到列表中的指定位置
(2)、刪除
E remove(int Index):刪除指定位置的元素,並返回該元素;
(3)、修改
E set(int index , E element):替換指定位置的元素,並返回被替換的元素
(4)、擷取
Int indexOf(Object o):返回指定元素第一次出現的索引,如果該list中不含則返回-1;
E get(int Index):返回指定位置的元素;
List<E> sublist(int fromIndex , int toIndex):返回列表指定的fromIndex(包括)和toIndex(不包括)之間的部分視圖(list);
實作類別ArrayList(常用)
ArrayList——數組序列,是List的一個重要實作類別
ArrayList底層是由數組實現的,可以動態增加容量
具體操作參考JDK參考文檔
實作類別LinkedList
LinkedList是基於鏈表實現的,是一個雙向迴圈列表。不是安全執行緒的。
具體操作參考JDK參考文檔
三:Set介面及其實作類別
集合Set是Collection的子介面,Set不允許其資料元素重複出現,也就是說在Set中每一個資料元素都是唯一的。
雖然集合號稱儲存的是 Java 對象,但實際上並不會真正將 Java 對象放入 Set 集合中,只是在 Set 集合中保留這些對象的引用而言。也就是說:Java 集合實際上是多個引用變數所組成的集合,這些引用變數指向實際的 Java 對象。
基本操作:
實作類別HashSet(常用)
HashSet通過Hash演算法排布集合內的元素,所謂的Hash演算法就是把任意長度的輸入(又叫做預映射),通過散列演算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射。對於不同類型的資訊,其散列值公式亦不完全相同。
當我們使用HashSet儲存自訂類時,需要在自訂類中重寫equals和hashCode方法,主要原因是集合內不允許有重複的資料元素,在集合校正元素的有效性時(資料元素不可重複),需要調用equals和hashCode驗證。
具體方法請參考說明文檔
實作類別TreeSet
TreeSet可以確保集合元素處於排序狀態。TreeSet採用紅/黑樹狀結構的資料結構來儲存集合元素。
TreeSet會調用集合元素的compareTo(Object o)方法來比較元素之間的大小關係,然後將集合元素按升序排列,這種方式是自然排序。
Java提供了一個Comparable介面,該介面定義一個compareTo(Object o)方法,該方法返回一個整數值,實現該介面的類必須實現該方法,實現該介面的類的對象就可以比較大小。當一個對象調用該方法與另一個對象進行比較時,例如:obj1.compareTo(obj2),如果該方法返回0,則代表這兩個對象相等;如果該方法返回一個正整數,則表明obj1大於obj2;如果該方法返回一個負整數,則表明obj1小於obj2。
1 @Override2 public int compare(People o1, People o2) {3 //先按年齡比較,如果年齡相等,則按姓名4 if(o1.getAge()==o2.getAge())5 return o1.getName().compareTo(o2.getName());6 else7 return o1.getAge()-o2.getAge();8 }
其他方法參考JDK文檔
四:Queue介面及其實作類別
顧名思義,Queue用於類比隊列這種資料結構。隊列先進先出。
Queue介面有一個PriorityQueue實作類別。除此之外,Queue還有一個Deque介面,Deque代表一個“雙端隊列”,雙端隊列可以同時從兩端刪除或添加元素,因此Deque可以當作棧來使用。java為Deque提供了ArrayDeque實作類別和LinkedList實作類別。
Queue介面中定義了如下的幾個方法:
void add(Object e): 將指定元素插入到隊列的尾部。
object element(): 擷取隊列頭部的元素,但是不刪除該元素。
boolean offer(Object e): 將指定的元素插入此隊列的尾部。當使用容量有限的隊列時,此方法通常比add(Object e)有效。
Object peek(): 返回隊列頭部的元素,但是不刪除該元素。如果隊列為空白,則返回null。
Object poll(): 返回隊列頭部的元素,並刪除該元素。如果隊列為空白,則返回null。
Object remove(): 擷取隊列頭部的元素,並刪除該元素。
PriorityQueue實作類別
PriorityQueue是一個比較標準的隊列實作類別。之所以是比較標準的原因是PriorityQueue儲存隊列元素的順序並不是按照排入佇列的順序,而是按照隊列元素的大小進行重新排序。因此當調用peek()或者是poll()的方法取出隊列中的元素通常都是最小的元素。
PriorityQueue不允許插入null元素,還要對隊列元素進行排序。具體方法參考JDK文檔
五:Map介面及其實作類別
- Map提供了一種映射關係,其中的元素是以索引值對(key-value)的形式儲存的,能夠實現根據key快速尋找value;
- key值不可重複,value值可以重複,一個value值可以和很多key值形成對應關係,每個建最多隻能映射到一個值
- Map 中元素的順序取決於迭代器迭代時的順序,有的實作類別保證了元素輸入輸出時的順序,比如說 TreeMap;有的實作類別則是無序的,比如 HashMap。
- key,value 都可以是任何參考型別的資料,包括 null
常用方法:
1、添加:
V put(K key, V value) (可以相同的key值,但是添加的value值會覆
蓋前面的,傳回值是前一個,如果沒有就返回null)
putAll(Map<? extends K,? extends V> m) 從指定映射中將所有映射關
系複製到此映射中(可選操作)。
2、刪除
remove() 刪除關聯對象,指定key對象
clear() 清空集合對象
3、擷取
value get(key); 可以用於判斷鍵是否存在的情況。當指定的鍵不存在的時候,返
回的是null。
4、判斷:
boolean isEmpty() 長度為0返回true否則false
boolean containsKey(Object key) 判斷集合中是否包含指定的key
boolean containsValue(Object value) 判斷集合中是否包含指定的value
5、長度:
Int size()
實作類別HashMap(重點)
HashMap不是安全執行緒的,如果想要安全執行緒的HashMap,可以通過Collections類的靜態方法synchronizedMap獲得安全執行緒的HashMap。
HashMap的底層主要是基於數組,鏈表和紅/黑樹狀結構來實現的,它之所以有相當快的查詢速度主要是因為它是通過計算散列碼來決定儲存的位置。HashMap中主要是通過key的hashCode來計算hash值的,只要hashCode相同,計算出來的hash值就一樣。如果儲存的對象對多了,就有可能不同的對象所算出來的hash值是相同的,這就出現了所謂的hash衝突。
具體方法看JDK文檔,建議看一下其源碼實現,因為HashMap以後用到的很多,只是知道其幾個簡單的使用方法是遠遠不夠的,但是這裡只是簡單認知,我就不再贅述,如果可以,以後會出。
實作類別TreeMap
TreeMap是非安全執行緒的。
可以採用可以通過Collections類的靜態方法synchronizedMap獲得安全執行緒:Map m = Collections.synchronizedSortedMap(new TreeMap(…));
TreeMap是用鍵來進行升序順序來排序的。通過Comparable 或 Comparator來排序。 (實現和TreeSet基本一致)。
HashMap與TreeMap的區別
- 實現方式
HashMap:基於雜湊表實現。使用HashMap要求添加的鍵類明確定義了hashCode()和equals()[可以重寫hashCode()和equals()],為了最佳化HashMap空間的使用,您可以調優初始容量和負載因子。
(1)HashMap(): 構建一個空的雜湊映像
(2)HashMap(Map m): 構建一個雜湊映像,並且添加映像m的所有映射
(3)HashMap(int initialCapacity): 構建一個擁有特定容量的空的雜湊映像
(4)HashMap(int initialCapacity, float loadFactor): 構建一個擁有特定容量和載入因子的空的雜湊映像
TreeMap:基於紅/黑樹狀結構實現。TreeMap沒有調優選項,因為該樹總處於平衡狀態。
(1)TreeMap():構建一個空的映像樹
(2)TreeMap(Map m): 構建一個映像樹,並且添加映像m中所有元素
(3)TreeMap(Comparator c): 構建一個映像樹,並且使用特定的比較子對關鍵字進行排序
(4)TreeMap(SortedMap s): 構建一個映像樹,添加映像樹s中所有映射,並且使用與有序映像s相同的比較子排序
- 用途
HashMap:適用於在Map中插入、刪除和定位元素。
TreeMap:適用於按自然順序或自訂順序遍曆鍵(key)。
HashMap通常比TreeMap快一點(樹和雜湊表的資料結構使然),建議多使用HashMap,在需要排序的Map時候才用TreeMap.