java的Map用法
Map用法
使用map進行排序時,需要先轉換成list型別,然後排序再通過Entry<k,v>型別遍歷
ArrayList<Map.Entry<Integer, Integer>> asList=new ArrayList<>(map.entrySet());
Collections.sort(asList,new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
// TODO Auto-generated method stub
return o2.getValue()-o1.getValue();
}
});
遍歷list,<k,v>作為整體遍歷
for(Map.Entry<Integer, Integer> mapping:asList){
int value=mapping.getValue();
int key=mapping.getKey();
}
介面概述
我們通過檢視Map介面描述,發現Map介面下的集合與Collection介面下的集合,它們儲存資料的形式不同,如下圖。
Collection中的集合,元素是孤立存在的(理解為單身),向集合中儲存元素採用一個個元素的方式儲存。
Map中的集合,元素是成對存在的(理解為夫妻)。每個元素由鍵與值兩部分組成,通過鍵可以找對所對應的值。
Collection中的集合稱為單列集合,Map中的集合稱為雙列集合。
需要注意的是,Map中的集合不能包含重複的鍵,值可以重複;每個鍵只能對應一個值。
Map中常用的集合為HashMap集合、LinkedHashMap集合。
Map介面中常用集合概述
通過檢視Map介面描述,看到Map有多個子類,這裡我們主要講解常用的HashMap集合、LinkedHashMap集合。
HashMap<K,V>:儲存資料採用的雜湊表結構,元素的存取順序不能保證一致。由於要保證鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。
LinkedHashMap<K,V>:HashMap下有個子類LinkedHashMap,儲存資料採用的雜湊表結構+連結串列結構。通過連結串列結構可以保證元素的存取順序一致;通過雜湊表結構可以保證的鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。
注意:Map介面中的集合都有兩個泛型變數<K,V>,在使用時,要為兩個泛型變數賦予資料型別。兩個泛型變數<K,V>的資料型別可以相同,也可以不同。
Map介面中的常用方法
沒有,則沒有這個鍵對應的值,返回null,並把指定的鍵值新增到集合中;
使用put方法時,若指定的鍵(key)在集合中存在,則返回值為集合中鍵對應的值(該值為替換前的值),並把指定鍵所對應的值,替換成指定的新值。
get方法:獲取指定鍵(key)所對應的值(value)
put方法:將指定的鍵與值對應起來,並新增到集合中
方法返回值為鍵所對應的值
使用put方法時,若指定的鍵(key)在集合中
remove方法:根據指定的鍵(key)刪除元素,返回被刪除元素的值(value)。
Map介面的方法演示
public class MapDemo {
public static void main(String[] args) {
//建立Map物件
Map<String, String> map = new HashMap<String,String>(); //資料採用的雜湊表結構
//給map中新增元素
map.put(“星期一”, “Monday”);
map.put(“星期日”, “Sunday”);
System.out.println(map); // {星期日=Sunday, 星期一=Monday}
//當給Map中新增元素,會返回key對應的原來的value值,若key沒有對應的值,返回null
System.out.println(map.put("星期一", "Mon")); // Monday
System.out.println(map); // {星期日=Sunday, 星期一=Mon}
//根據指定的key獲取對應的value
String en = map.get("星期日");
System.out.println(en); // Sunday
//根據key刪除元素,會返回key對應的value值
String value = map.remove("星期日");
System.out.println(value); // Sunday
System.out.println(map); // {星期一=Mon}
}
}
Map集合遍歷鍵找值方式
鍵找值方式:即通過元素中的鍵,獲取鍵所對應的值
操作步驟與圖解:
1.獲取Map集合中所有的鍵,由於鍵是唯一的,所以返回一個Set集合儲存所有的鍵
2.遍歷鍵的Set集合,得到每一個鍵
3.根據鍵,獲取鍵所對應的值
程式碼演示: //利用了迭代器Iterator (點此瞭解迭代器)
public class MapDemo {
public static void main(String[] args) {
//建立Map物件
Map<String, String> map = new HashMap<String,String>();
//給map中新增元素
map.put(“鄧超”, “孫儷”);
map.put(“李晨”, “范冰冰”);
map.put(“劉德華”, “柳巖”);
//獲取Map中的所有key
Set keySet = map.keySet();
//遍歷存放所有key的Set集合
Iterator it =keySet.iterator(); **
while(it.hasNext()){ //利用了Iterator迭代器**
//得到每一個key
String key = it.next();
//通過key獲取對應的value
String value = map.get(key);
System.out.println(key+"="+value);
}
}
}
Map集合遍歷鍵值對方式
鍵值對方式:即通過集合中每個鍵值對(Entry)物件,獲取鍵值對(Entry)物件中的鍵與值。
操作步驟與圖解:
1.獲取Map集合中,所有的鍵值對(Entry)物件,以Set集合形式返回。
2.遍歷包含鍵值對(Entry)物件的Set集合,得到每一個鍵值對(Entry)物件
3.通過鍵值對(Entry)物件,獲取Entry物件中的鍵與值。
public class MapDemo {
public static void main(String[] args) {
//建立Map物件
Map<String, String> map = new HashMap<String,String>();
//給map中新增元素
map.put(“鄧超”, “孫儷”);
map.put(“李晨”, “范冰冰”);
map.put(“劉德華”, “柳巖”);
//獲取Map中的所有key與value的對應關係
Set<Map.Entry<String,String>> entrySet = map.entrySet();
//遍歷Set集合
Iterator<Map.Entry<String,String>> it =entrySet.iterator();
while(it.hasNext()){
//得到每一對對應關係
Map.Entry<String,String> entry = it.next();
//通過每一對對應關係獲取對應的key
String key = entry.getKey();
//通過每一對對應關係獲取對應的value
String value = entry.getValue();
System.out.println(key+"="+value);
}
}
}
注意:Map集合不能直接使用迭代器或者foreach進行遍歷。但是轉成Set之後就可以使用了。
下面轉載自來自一個Map的用法例子:
//假設key 為Integer型 value 為String ,具體自行定義
Map<Integer,String> map = new HashMap<Integer,String>();
放入資料
map.put(1,“a”);
map.put(2,“b”);
map.put(3,“c”);
根據key獲取對應的value
map.get(1); //獲取到對應key=1時的value=a
遍歷方法1:keyset遍歷
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
int key = iter.next();
String value = map.get(key);
}
————————————————————————————————————————————
//還有一種寫法 用for each
for (String key : map.keySet()) {
String value = map.get(key);
}
遍歷方法2:
Iterator<Entry<String, String>> iter = map.entrySet().iterator();
Entry<String, String> entry;
while (iter.hasNext()) {
entry = iter.next();
int key = entry.getKey();
String value = entry.getValue();
}
//同樣的for each寫法
for (Entry<String, String> entry: map.entrySet()) {
int key = entry.getKey();
String value = entry.getValue();
}
另外,在考慮效率方面,for each速度更快一點點,推薦使用for each寫法來遍歷。