1. 程式人生 > 其它 >java的Map用法

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寫法來遍歷。