Map 集合(雙列集合接口)
特點:
1.以鍵值對的形式存儲元素
2.通過鍵可以找到值
3.鍵是唯一的,值是可以重複的
4.Map集合的<k,v>泛型,是用來限制Map集合中的鍵的類型和值的類型常用子類:
HashMap:存儲數據採用的哈希表結構,元素的存取順序不能保證一致
由於要保證 鍵 的唯一、不重複,需要重寫 鍵的hashCode()方法、equals()方法。
LinkedhashMap<K,V>:HashMap下有個子類LinkedHashMap,存儲數據採用的哈希表結構+鏈表結構。
通過鏈表結構可以保證元素的存取順序一致;通過哈希表結構可以保證
鍵 的唯一,不重複,需要重寫鍵的hashCode()方法、equals()方法
Map集合常用的方法(必須掌握)
public V put(K key, V value) : 往集合中添加鍵值對,放回之前該鍵對應的值
public V remove(Object key) : 根據鍵刪除該鍵對應的鍵值對,返回被刪除元素的 值。
public int size(): 獲取鍵值對的長度
boolean containsKey(Object key) 如果此映射包含對於指定鍵的映射關係,則返回 true。
boolean containsValue(Object value) 如果此映射將一個或多個鍵映射到指定值,則返回 true。
public V get(Object key) 根據指定的鍵獲取對應的值。
public collection values(): 獲取Map集合中所有的值,存儲到collection集合中
public Set keySet() : 獲取Map集合中所有的鍵,存儲到Set集合中。
public Set<Map.Entry<K,V>> entrySet() : 獲取到Map集合中所有的鍵值對對象的集合(Set集合)。
Map<K,V>:接口
- K: 用來限制集合中鍵的數據類型
- V: 用來限制集合中值的數據類型
- Map集合中常用實現類的介紹:
- HashMap:存儲元素的結構是哈希表結構,特點:鍵唯一,鍵值對的存取無序
- LinkedHashMap:存儲元素的結構是鏈表+哈希表結構,特點:鍵唯一,鍵值對的存取有序
- TreeMap:特點:鍵唯一,對鍵值對元素進行排序
Map集合的第一種遍歷方式:
通過 鍵找值 的方式遍歷雙列集合
思路:
1.獲取該集合的所有建
2.遍歷所有的鍵的集合,得到每一個鍵
3.根據鍵找對應的值
HashMap<Integer,String> map=new HashMap<>();
//往map集合中添加元素
map.put(1,"張三");
map.put(2,"李四");
map.put(3,"王五");
map.put(4,"錢六");
map.put(5,"田七");
//1.獲取該集合的所有鍵
Set<Integer> keySet=map.keySet();
//2.遍歷所有的鍵的集合,得到每一個鍵
for(Integer key:keySet){
//3.根據鍵找對應的值
String value=map.get(key);
Sytem.out.println(key+":"+value);
}
Map集合的第二種遍歷方式:
通過 鍵值對對象 的方式遍歷雙列集合
思路:
1.獲取該集合的所有 鍵值對 對象
2.遍歷該鍵值對對象的Set集合,拿到每一個鍵值對對象
3.調用鍵值對對象的getKey()和getValue()方法獲取鍵和值
Map.Entry接口中的方法:
public K getKey(); 獲取Entry對象中的鍵
public V getValue; 獲取Entry對象中的值
// 創建一個Map集合,鍵的類型是:Integer,值的類型是String
Map<Integer, String> map = new HashMap<>();
// 往map集合中添加鍵值對
map.put(1, "張三");// 鍵值對是由2部分組成,一部分是鍵,一部分是值,鍵值是相互對立
map.put(2, "李四");
map.put(3, "王五");
map.put(4, "趙六");
// public Set<Map.Entry<K,V>> entrySet(): 獲取到Map集合中所有的 鍵值對對象 的集合(Set集合)
// entrySet()方法是用來獲取Map集合中所有的鍵值對對象,一個元素,鍵和值在一起了
// Entry將鍵值對的對應關係封裝成了對象。即鍵值對對象
// Set<Map.Entry<Integer, String>> set = map.entrySet();
// 第二種方法遍歷:根據鍵值對對象的方式遍歷Map集合
// 2.1 獲取該集合中所有的鍵值對對象
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
// 2.2 遍歷所有的鍵值對對象(Entry)for (Map.Entry<Integer, String> entry : entrySet) {
//2.3 使用鍵值對象對象獲取鍵和值
//2.4 獲取鍵
Integer key = entry.getKey();
// 2.4 獲取值
String value = entry.getValue();
System.out.println(key+"..."+value);}tem.sout.println(key+":"+value);
}
HashMap集合保證鍵唯一的原理:依賴鍵的hashCode()和equals()方法
- 當HashMap集合要存儲鍵值對的時候,會調用鍵的hashCode方法計算該鍵對應的哈希值
- 判斷該哈希值對應的位置是是否有相同哈希值的鍵
- 如果該位置上沒有相同哈希值的鍵,那麼就直接存儲該鍵值對
- 如果該位置上有相同哈希值的鍵,那麼就產生了哈希衝突
- 如果產生了哈希衝突就會調用該鍵的equals方法,判斷該鍵與該位置上的所有的鍵是否相等,
如果該鍵與其中任何一個鍵相等,那麼就覆蓋之前的鍵值對
如果該鍵與其中任意一個鍵都不相等,那麼就存儲鍵值對
HashMap存儲自定義類型鍵值:保證鍵唯一,必須重寫鍵的hashCode()和equals()方法
LinkedHashMap存儲自定義類型鍵值:保證鍵唯一,必須重寫鍵的hashCode()和equals()方法 LinkedHashMap:是由哈希表保證鍵唯一,由鏈表保證元素存取有序
HashMap:是由哈希表保證鍵唯一
List,Set,Map集合都有一個靜態方法 of(),適合添加批量少量元素,並且創建出來的集合是不可以變的
jdk 9 對集合添加元素的優化:
Java 9,添加了幾種集合工廠方法,更方便創建少量元素的集合、map實例。
新的List、Set、Map的靜態工廠方法可以更方便地創建集合的不可變實例。
作用:適合添加少量元素
注意:
- of()方法只是Map,List,Set這三個接口的靜態方法,其父類接口和子類實現並沒有這類方法,比如 HashSet,ArrayList等待;
- 返回的集合是不可變的;