Map集合
-
- 1.Map接口實作類的特點
-
- 1.EntrySet介紹
- 2.Map接口常用方法
- 3.Map接口周遊方法
-
- 1.keySet周遊
- 2.values周遊
- 3.EntrySet周遊
- 4.HashMap小結
- 5.HashTable的基本介紹
-
- 1.HashTable底層簡單說明
- 6.Hashtable和HashMap對比
- 7.Properties
- 8.開發中如何選擇集合實作類
- 9.TreeSet和TreeMap排序
-
- 1.TreeSet
- 2.TreeMap
- 10.Collections工具類
-
- 1.Collections工具類介紹
- 2.排序操作
- 3.查找與替換操作
1.Map接口實作類的特點
注意:這裡講的是JDK8的Map接口特點
- Map與Collection并列存在,用于儲存具有映射關系的資料key-value;
- Map中的key和value可以是任何引用類型的資料,會封裝到HashMap$Node對象中;
- Map中的key不允許重複;
- Map中的value可以重複;
- Map的key可以為null,value也可以為null,注意key為null隻能有一個,value為null,可以多個;
- 常用String類作為Map的key;
- key和value之間存在單向一對一關系,即通過指定的key總能找到對應的value;
- Map存放資料的key-value,一對k-v是放在一個Node中的,又因為Node實作了Enty接口,有些書上也說,一對k-v就是一個Entry。
1.EntrySet介紹
- k-v 最後是 HashMap$Node node = new Node(hash,key,value,null);
- k-v為了友善程式員周遊,還會建立EntrySet集合,該集合存放的元素類型是Entry,而Entry對象就有k-v【EntrySet<Entry<K,V>>】。
- entry中,定義的類型是Map.Entry ,但是實際上存放的還是HashMap N o d e , 這 是 因 為 H a s h M a p Node,這是因為HashMap Node,這是因為HashMapNode implments Map.Entry。
- 當把HashMap$Node對象存放到EntrySet就友善我們周遊了,因為Map.Entry提供了重要的方法getKey()和getValue()。
2.Map接口常用方法
- put 添加
- remove 根據鍵删除映射關系
- get 根據鍵擷取值
- size 擷取元素個數
- isEmpty 判斷個數是否為0
- containsKey 查找鍵是否存在
3.Map接口周遊方法
- containsKey 查找鍵是否存在
- keySet 擷取所有的鍵
- entrySet 擷取所有關系
- values 擷取所有的值
1.keySet周遊
Map map = new HashMap();
map.put("A","1");
map.put("B","2");
map.put("C","3");
map.put("D","4");
//第一組:先取出所有的key,通過key取出對應的value
Set keyset = map.keySet();
//1.增強for
for(Object key:keyset){
System.out.println(key + "-" + map.get(key));
}
//2.疊代器
Iterator iterator = keyset.iterator();
while (iterator.hasNext()){
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}
2.values周遊
Map map = new HashMap();
map.put("A","1");
map.put("B","2");
map.put("C","3");
map.put("D","4");
//第二組,把所有的values取出來
Collection values = map.values();
//這裡可以使用所有的Collections使用的周遊方法
//1.增強for
//取出所有的值
for(Object value:values){
System.out.println(value);
}
//2.疊代器
Iterator iterator1 = values.iterator();
while (iterator1.hasNext()){
Object value = iterator1.next();
System.out.println(value);
}
3.EntrySet周遊
Map map = new HashMap();
map.put("A","1");
map.put("B","2");
map.put("C","3");
map.put("D","4");
//第三組,通過EntrySet 來擷取k-v
Set entrySet = map.entrySet();
//1.增強for
for (Object entry : entrySet){
//将entry轉成Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
//2.疊代器
Iterator iterator2 = entrySet.iterator();
while (iterator2.hasNext()){
Map.Entry m = (Map.Entry) iterator2.next();
System.out.println(m.getKey() + "-" + m.getValue());
}
4.HashMap小結
- Map接口的常用實作類:HashMap、hashtable、properties;
- HashMap是Map接口使用頻率最高的實作類;
- HashMap是以key-value對的方式存儲資料;
- key不能重複,但是值礦業重複,允許使用null鍵和null值;
- 如果添加相同的key,則會覆寫原來的值;
- 與hashSet一樣,不保證映射的順序,因為底層是以hash表的方式來存儲的;
- HashMap沒有實作同步,是以是線程不安全的。
5.HashTable的基本介紹
- 存放的元素時鍵值對:即K-V;
- hashtable的鍵和值都不能為null;
- hashtable使用方法基本上和HashMap一樣;
- hashtable是線程安全,HashMap是線程不安全;
1.HashTable底層簡單說明
- 底層有數組Hashtable$Entry[] 初始化大小為11;
- threshold 8 = 11 * 0.75;臨界值
- 擴容:(前容量*2)+1 ;
6.Hashtable和HashMap對比
版本 | 線程安全(同步) | 效率 | 允許null鍵null值 | |
---|---|---|---|---|
HashMap | 1.2 | 不安全 | 高 | 可以 |
Hashtable | 1.0 | 安全 | 較低 | 不可以 |
7.Properties
- Properties類繼承自Hashtable 類并且實作了Map接口,也是使用一種鍵值對的形式來儲存資料;
- 它的使用特點和Hashtable類似;
- Properties還可以用于從xxx.properties檔案中,加載資料到Properties類對象,并進行讀取和修改;
8.開發中如何選擇集合實作類
- 先判斷存儲的類型(一組對象或一組鍵值對);
-
一組對象:Collection接口
允許重複:List
增删多:LinkedList【底層維護了一個雙向連結清單】
改查多:ArrayList 【底層維護了Object類型的可變數組】
不允許重複:Set
無排序:HashSet 【底層是HashMap ,維護了一個哈希表,即數組+連結清單+紅黑樹】
排序: TreeSet
插入和取出順序一緻:LinkedHashSet (底層是LinkHashMap(底層是HashMap))【維護數組+雙向連結清單】
-
一組鍵值對:Map
鍵無序: HashMap 【底層是:哈希表;jdk7:數組+連結清單;jdk8:數組+連結清單+紅黑樹】
鍵排序:TreeMap
鍵插入和取出順序一緻:LinkedHashMap
讀取檔案:Properties
9.TreeSet和TreeMap排序
1.TreeSet
//排序
TreeSet treeSet = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//調用Sting的compareTo方法比較大小
return ((String)o2).compareTo((String)o1);
}
});
treeSet.add("a");
treeSet.add("b");
treeSet.add("c");
treeSet.add("d");
System.out.println(treeSet);
2.TreeMap
//[排序
TreeMap treeMap = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//調用Sting的compareTo方法比較大小
return ((String)o1).compareTo((String)o2);
}
});
treeMap.put("a","1");
treeMap.put("b","2");
treeMap.put("c","3");
treeMap.put("d","4");
10.Collections工具類
1.Collections工具類介紹
- Collections是一個操作Set、List和Map等集合的工具類;
- Collections中提供了一系列靜态的方法對集合元素進行排序、查詢和修改等操作。
2.排序操作
- reverse(List):反轉List中元素的排序;
- shuffle(List):對List集合元素進行随機排序;
- sort(List):根據元素的自然順序對指定List集合元素按升序排序;
- sort(List、Comparator):根據指定的Comparator産生的順序對List集合元素進行排序;
- swap(List、int、int):将指定List集合中的i處元素和j處元素進行交換。
3.查找與替換操作
- Object max(Collection):根據元素的自然順序,傳回給定集合中的最大元素;
- Object max(Collection , Comparator):根據Comparator指定的順序,傳回給定集合中的最大元素;
- Object min(Collection);
- Object min(Collection , Comparator);
- int frequency(Collection , Object):傳回指定集合中指定元素的出現次數;
- void copy(List dest , List src):将src中的内容複制到dest中;
- boolean replaceAll(List list , Object oldVal , Object newVal):使用新值替換List對象的所有舊值。