今天我們對集合框架進行一下總結,首先看一下集合框架的結構
Java集合框架
Collection知識點: Collection接口中的方法、是集合中所有實現類必須擁有的方法。比如:
1.boolean remove(Object o)移除集合中指定的元素。
2.Object[] toArray() 集合中的元素,轉成一個數組中的元素, 集合轉成數組
集合轉成數組
3.void clear() 清空集合中的所有元素。
清空操作
List知識點:List集合是可變數組,繼承Collection接口。List接口特點: 有序,有索引,可以重複元素。相關操作:
set(int index, E)//修改指定索引上的元素, 返回被修改之前的元素。
List的Set方法
remove(int index)//移除指定索引上的元素、 返回被刪除之前的元素。
List的remove方法
add(int index, E)// 將元素插入到列表的指定索引上,帶有索引的操作,防止越界問題.
List的add方法
ArrayList知識點:底層數組實現,查詢快,增刪慢。 默認10個元素。LinkedList 知識點:底層鍊表實現,增刪塊,查詢慢,LinkedList提供大量對首尾的操作(removeFirst、removeLast、getFirst、getLast、addFirst、addLast)。子類的特有功能,不能多態調用。他們線程都不安全,因此運行速度快。
值得注意的是:就是在遍歷的過程中,使用了集合方法修改了集合的長度,不允許的,稱為並發修改異常。
並發修改異常
Set集合知識點:Set接口,特點不重複元素,沒索引,Set接口的實現類:
HashSet (哈希表),特點: 無序集合,存儲和取出的順序不同,沒有索引,不存儲重複元素,代碼的編寫上,和ArrayList完全一致,hashset底層就是hashmap 默認16 個元素。
不允許重複
HashSet集合的自身特點:底層數據結構是哈希表(通過hashCode進行存儲),存儲,取出都比較快 、 線程不安全,運行速度快。
LinkedHashSet:LinkedHashSet 基於鍊表的哈希表實現。 繼承自HashSet。雙向鍊表實現。LinkedHashSet 自身特性,具有順序,存儲和取出的順序相同的 線程不安全的集合,運行速度塊
(hashset 取出不一定按順序,LinkedHashSet取出是有序的,但是都不允許重複)
對於自定義對象判斷是否重複,需要重寫 hashcode 和equals方法。我們先看看String類是如何判斷重複的
先查看hashcode是否一樣(不同的元素hash值有可能一樣,哈希表默認長度是16,加載因子是0.75,此時性能最好),當HashCode一樣的時候,我們再調用equals方法判斷是否相等。當我們需要判斷自定義對象的時候,我們需要告訴計算機我們是如何判斷的。
自定義對象判斷重複
然後再Person類裡面重寫hashCode和equals方法
重寫hashCode和equals(可以代碼自動生成,也可以自己寫)
值得注意的一點:
Map集合關鍵詞:鍵值對。Map有多個子類,這裡我們主要講解常用的HashMap集合、LinkedHashMap集合。
HashMap集合實例:
hashmap的remove方法
hashmap的get方法
Map集合的遍歷:keySet然後get值來遍歷(不能保證順序)。增強for不能遍歷map 但是可以遍歷set
map集合的遍歷方式
entryset方法獲取鍵值對的關係對象來遍歷(不能保證順序)
entryset方法獲取鍵值對的關係對象
如果map的鍵(key)是自定義對象,就需要重寫hashcode和equals方法來保證鍵(key)的唯一性;
重寫hashcode和equals方法來保證鍵(key)的唯一性
我們可以看到,當鍵值重複的時候,後面一個覆蓋前面一個(person類已經重寫了hashcode和equals方法來保證鍵(key)的唯一性,這個和前面的一樣)
LinkedHashMap繼承HashMap保證迭代的順序。
保證迭代的順序。
Collections:集合操作的工具類實例
方法的可變參數: JDK1.5新的特性,方法的可變參數
* 前提: 方法參數數據類型確定,參數的個數任意
* 可變參數語法: 數據類型...變量名
* 可變參數,本質就是一個數組
最後拋出一個問題吧,map集合裡是可以存map的(map存的是鍵值對),map存map有點像PHP 的二維數組。
假設一個學校對應兩個班級,一個班級對應兩個學生(學號+姓名)。
即 學校有兩個班的名字(兩個鍵key),通過名字(鍵key)找到班級。班級的學生都有學號(鍵key)對應姓名(值)。
因此就需要多遍歷一次。具體方式代碼有點多,還是使用 keyset或者entrySet方式,參考前面map的遍歷方式。