【Java的集合框架】
接口:
collection map
list set
實現類:
ArryList HashSet HashMap
LinkList LinkHashSet LinkHashMap
TreeSet TreeMap
HashTable
【四個接口的區別】
1、collection:存儲不唯一、無序的數據;
2、list:存儲有序的、不唯一的數據;
3、set:存儲無序的、唯一的數據;
4、Map:以鍵值對的形式存儲數據,以鍵取值。鍵不能重復、值可以重復。
【List接口】
1、常用方法:
① add():在列表的最后添加元素;
② add(int index,E element):在列表的指定位置插入元素;
③ size():返回當前列表的元素個數;
④ get(int index):返回下標為index的元素。
如果沒有泛型約束,返回Object類型,需要強轉;如果有泛型約束,直接返回泛型類型,無需強轉。
⑤ clear():清除列表中的所有數據
isEmpty():檢測列表是否為空
⑥ contains():傳入一個對象,檢測列表中是否包含該對象。
如果傳入的是String和基本數據類型,可以直接比對
如果傳入的是實體類,則默認只比對兩個對象的地址。因此,需要在實體類重寫equals()方法;
Tips:
String s = "123";
"123".equals(s);//這個順序可以防止空指針
⑦ indexOf():傳入一個對象,返回該對象在列表中首次出現的地址。
lastIdexOf():傳入一個對象,返回該對象在列表中最后一次出現的地址。
⑧remove():傳入一個下標,或者一個對象,刪除指定元素;
如果傳入下標,返回被刪除的對象,如果下標大於size(),會報下標越界異常;
如果傳入對象,則要求重寫equals方法,返回true或false表示刪除是否成功
⑨set(index, obj):用新傳入的對象,將指定位置的元素替換掉;
返回被替換掉的元素對象。
⑩subList(1,3):截取一個子列表,返回List類型;
toArray():將列表轉為數組。返回一個Object[]類型的數據
2、ArrayList
實現了一個長度可變的數組,在內存空間中開辟一串連續的空間,與數組的區別在於長度可以隨意修改。這種存儲結構在循環遍歷和隨機訪問元素的速度比較快。
3、LinkedList
使用鏈表結構存儲數據,在插入和刪除元素時速度非常快。
LinkedList的特有方法:
① addFirst():開頭插入元素。
addLast():結尾插入元素。
② removeFirst():刪除第一個元素,並返回被刪除的元素。
removeLast():刪除最后一個元素,並返回被刪除的元素。
③getFirst():返回列表的第一個元素,不刪除。
getLast():返回列表的最后一個元素,不刪除。
【Set接口】
1、常用方法:與List接口基本相同。
但是,由於Set接口中的元素是無序的,因此沒有與下標相關的方法。
例如:get() remove() add()
2、Set接口的特點:唯一、無序;
3、HashSet 底層是調用HashMap的相關方法,傳入數據后,根據數據的HashCode進行散列運算,得到一個散列值后再進行運算,確定元素在列表中的位置。
HashSet如何確定一個對象是否相等?
① 先判斷對象的hashCode(),如果hashCode不同,那肯定不是一個對象。
如果hashCode相同,那繼續判斷equals()方法;
② 重寫equals()方法。
所以,使用HashSet存儲實體對象時,必須重寫對象的hashCode() 和 equals()兩個方法!!
4、LinkedHashSet:在HashSet的基礎上,新增了一個鏈表。
用鏈表來記錄HashSet中元素放入的順序,因此使用迭代器遍歷時,可以按照放入的順序依次讀出元素。
5、TreeSet:將存入的元素,進行排序,然后輸出。
如果存入的是實體對象,那么實體類必須實現Comparable接口,並重寫compareTo()方法。
或者,也可以在實例化TreeSet的同時,通過構造函數傳入一個比較器(一個實現了Comparator接口,並重寫了compare()方法的實現類的對象。
Set<person> set = new TreeSet<Person>(new Comparator(){
public int compare(Person p1,Person p2){
return p1.getId() - p2.getId();
}
});
Set<Person> set = new TreeSet<Person>(new Compare());
class Compare implements Comparator(){
//重寫compare方法
}
【Comparable接口和Comparator接口的區別】
1、Comparable由實體類實現,重寫comparTo()方法;
實體類實現Comparable接口以后,TreeSet使用空參構造即可
2、Comparator需要單獨一個比較類進行實現,重寫Compare()方法。
實例化TreeSet的時候,需要傳入這個比較類的對象。
【Map接口】
1、Map接口特點:以鍵值對的形式存儲數據,以鍵取值。
鍵不能重復,值可以重復。
2、Map接口的常用方法:
① put(key,value):向map的最后追加一個鍵值對;
② get(key):通過鍵,取到一個值;
③ clear():清除Map中的所有數據;
④ containsValue(obj):檢測是否包含指定的鍵
containsKey(obj):檢測是否包含指定的鍵
【HashMap 與 Hashtable 的主要區別】
1、Hashtable是線程安全的(線程同步),HashMap是線程不安全的(線程不同步);
2、Hashtable的鍵不能為null,HashMap的鍵可以為null;
3、HashMap繼承了AbstractMap,HashTable繼承Dictionary抽象類,兩者均實現Map接口。
4、HashMap的初始容量為16,Hashtable初始容量為11,兩者的填充因子默認都是0.75。
5、HashMap擴容時是當前容量翻倍即:capacity*2,Hashtable擴容時是容量翻倍+1即:capacity*2+1。
【LinkedHashMap】
可以使用鏈表,記錄數據放入的次序,進入讓讀出的順序與放入的順序一致,與LinkedHashSet一樣。
【TreeMap】
根據鍵的順序,進行排序后,輸出。
如果傳入的是實體對象,必須重寫比較函數。詳見TreeSet。