java基礎之map集合總結
1 什麼是map集合?
我認為map集合的使用了儲存具有那種對應關係的物件的集合。根據Interface Map<K,V> K鑰匙的Map保持型 V 對映的值的型別,集合中儲存了兩個屬性,一個是key一個是value,也就是鍵值對的關係,找到鍵就可以相應的值,就類似學生的學號,我們的身份證,都是和我一一對應的。 其實這個也可以和collection集合做個比較: 圖:
1.1 Map集合中常用的子類:
AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap
- HashMap:
底層是hash表組成(陣列+連結串列的結構的,在jdk1.8之後是陣列+連結串列/紅黑樹),元素的存取的順序不一樣,無序集合。在自定義資料型別的時候,為了保證資料的唯一性,必須重寫Hashcode()和equals方法,保證key的唯一性
- LinkHashMap:
同樣底層是hash表+連結串列的結構,因為多加了一條連結串列,就可以保證儲存資料的順序,有序集合,也就是通過重寫了Hashcode()和equals方法 實現了資料的唯一性。
1.2 Map集合中常用方法
api檔案:
-
public v put (K key,V value);將指定的值與此對映中的指定鍵關聯(可選操作)。
-
public v remove(Object key); 如果存在(可選操作),則從該Map中移除一個鍵的對映。
-
public V get(Object key) 根據指定的鍵,在Map集合中獲取對應的值。(value)
-
public Set keySet() : 獲取Map集合中所有的鍵,儲存到Set集合中。
-
public boolean containsKey(Object key) /containsValue(Object value)
-
public Set<Map.Entry<K,V>> entrySet() : 獲取到Map集合中所有的鍵值對物件的集合(Set集合);判斷集合中是否儲存value或者key,多判斷key。
-
程式碼如下:
private static void showPutMethod() { /** * put語法規則 * 首次新增元素的時候,如果k的值是不重複的 則會返回一個null * 如果新增重複k的值 則第二次新增的v的值會把第一次v的值替換的 返回的是被替換的數值 * k是不允許重複的 而value是可以重複的 */ Map<String,String> map = new HashMap<>(); String put = map.put("zsb","張博陽"); String put1 = map.put("zsb","昔年"); String put2 = map.put("dsa","褐瞳"); String put3 = map.put("ewqe","心塞"); String put4 = map.put("zsgf","昔年"); System.out.println(map); } /** * remove(object k)指定k 返回v * 存在則有返回值 * 不存在 返回null */ private static void removeTestMethod() { Map<String,Integer> map = new HashMap<>(); // String person = map.put("海綿寶寶","100"); // String person2 = map.put("派大星","230"); // String person3 = map.put("章魚哥","321"); // String person4 = map.put("蟹老闆","456"); // String one = map.remove("海綿寶寶"); // System.out.println(one);//返回100 //返回null Integer dsada = map.remove("dsada"); System.out.println(dsada);//null } /** * get語法規則 輸入數值 返回鍵的關係 * 有鍵返回值數值 * 沒有鍵 返回空 * */ //map集合儲存 Map<String,String> mapList = new HashMap<>(); String put = mapList.put("zsb","一品御前帶刀侍衛"); System.out.println(put); mapList.put("派大星","赤犬星"); mapList.put("海綿寶寶","黃袁寶寶"); mapList.put("章魚哥","青雉魚"); mapList.put("zsb","酷酷的張博陽"); //get方法 String zz = mapList.get("章魚哥"); System.out.println(zz); // 返回青雉魚 System.out.println(mapList); /** * containsKey * 查詢集合中是否包含該元素 * 如果有 true * 沒有 false */ private static void containsMethod(){ Map<String,String> map = new HashMap<>(); String one = map.put("zsb","保安隊長"); String two = map.put("zsb","保安"); String three = map.put("zsbaa","保安"); String four = map.put("zsbss","保安"); boolean zbs = map.containsKey("zsb"); boolean zbs1 = map.containsKey("zdsadbs"); // System.out.println(zbs);//true // System.out.println(zbs1);// false 複製程式碼
1.3 Hashmap集合的遍歷方法
方法一:
通過keyset方法把Map集合轉換成Set集合,然後我們就可以對Set集合進行迴圈遍歷,可以使用增強for迴圈的方式,也可以使用迭代器的方式進行迴圈遍歷。在我們迴圈遍歷之後,我們拿到了key的數值,然後通過Map的get方法 然後可以獲得集合中的value方法:如圖所示
程式碼如下:
Map<String,String> mapList = new HashMap<>();
String put = mapList.put("zsb","一品御前帶刀侍衛");
System.out.println(put);
mapList.put("派大星","赤犬星");
mapList.put("海綿寶寶","黃袁寶寶");
mapList.put("章魚哥","青雉魚");
mapList.put("zsb","酷酷的張博陽");
//利用增強for迴圈
/**
* 通過keyset方法把 map集合裡面的key的值儲存打set集合裡面,然後遍歷set集合,即可得到key的數值,然後通過map的
* get方法 通過key獲得value 然後就完成了遍歷
*/
Set<String> setList = mapList.keySet();
for (String s : setList) {// 這裡可以直接寫 :mapList.keySet();
//現在拿到集合裡面的value的數值了 然後通過map.get的方法 獲得裡面的數值
String value = mapList.get(s);
System.out.println(value);
}
//利用迭代器進行迴圈遍歷
System.out.println("-----------------");
Iterator<String> iteratorSet = setList.iterator();
while (iteratorSet.hasNext()) {
String next = iteratorSet.next();
String value2 = mapList.get(next);
System.out.println(value2);
}
複製程式碼
方法2 通過他的內部巢狀類(entry)進行呼叫
當Map集合建立的時候,就自動建立了Entry物件,用來記錄鍵和值的關係。 我們可以通過Map.entrySet方法把Map集合中的多個Entry物件取出來儲存到set集合中 ,剩下的就和上面一樣通過迴圈的方式進行遍歷,但是Entry介面,他自己有兩個方法分別是getkey和 getValue方法 然後分別獲取鍵和值。 程式碼如下:
public static void main(String[] args) {
Map<String,"一品御前帶刀侍衛");
mapList.put("派大星","酷酷的張博陽");
//增強for迴圈的方式
for (Map.Entry<String,String> entryList :mapList.entrySet()){
String key = entryList.getKey();
String value = entryList.getValue();
System.out.println(key + value);
}
//利用迭代器方式
Set<Map.Entry<String,String>> entries = mapList.entrySet();
Iterator<Map.Entry<String,String>> iterator = entries.iterator();
while (iterator.hasNext()) {
Map.Entry<String,String> next = iterator.next();
String key = next.getKey();//分別獲取到key的數值
String value = next.getValue();//分別獲得value的數值
System.out.println(key + value);
}
}
//同樣是for迴圈為什麼這個entry不能同Map.get()方法獲得value值,把獲得next穿進去,為什麼返回值是null
//我探究了一下 之前的Map集合建立了set物件 裡面儲存的是key的集合,當然可以用get方法傳遞key獲得value
//而entry就不同了,集合裡面儲存的是迴圈遍歷之後的entry物件,又不是key當然獲取不出來了。
複製程式碼
自定義資料型別
如果自定義資料型別作為鍵的話,一定要重寫裡面的getCode和equals方法保證鍵的唯一性
程式碼如下: 自定義資料型別:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
People people = (People) o;
return age == people.age &&
Objects.equals(name,people.name);
}
@Override
public int hashCode() {
return Objects.hash(name,age);
}
主方法如下:
public static void main(String[] args) {
getMethod();
getMethod2();
}
private static void getMethod(){
HashMap<People,String> peopleStringHashMap = new HashMap<>();
peopleStringHashMap.put(new People("海綿寶寶",20),"蟹黃堡廚師");
peopleStringHashMap.put(new People("派大星","海綿寶寶最好的朋友");
peopleStringHashMap.put(new People("章魚哥",30),"蟹黃包的收銀員");
//遍歷集合
for (People people : peopleStringHashMap.keySet()) {
String value = peopleStringHashMap.get(people);
System.out.println(value);
}
}
private static void getMethod2() {
HashMap<People,"蟹黃包的收銀員");
//通過建立entry物件的方式
Set<Map.Entry<People,String>> entries = peopleStringHashMap.entrySet();
//建立迭代器
Iterator<Map.Entry<People,String>> iterator = entries.iterator();
while (iterator.hasNext()) {
Map.Entry<People,String> entry = iterator.next();
People key = entry.getKey();
String value = entry.getValue();
System.out.println(key + value);
}
}
複製程式碼
1.3 linkHashMap和linkHashtable
- linkHashMap相比HashMap集合就是多了一個link然後可以保證存取順序,這點是最大的區別
- 而linkHashtable 底層是一個雜湊表,是單執行緒的速度較慢,集合不能儲存null建和值(在1.2之後被hashMap取代)