Java集合-Map(簡單概述和案例)
Map
Map和Collection儲存資料的形式不同
Collection中的集合,元素時孤立存在的(理解為單身),想集合中儲存元素採用一個個元素的方式儲存。
Map中的集合,元素是成對存在的。每個元素由鍵和值兩部分組成,通過鍵可以找所對應的值。
Collection中的集合稱為單列集合,Map中的集合稱為雙列集合。
需要注意的是,Map中的集合不能包含重複的鍵,值可以重複;每個鍵只能對應一個值。
HashMap<K, V>:儲存資料採用的雜湊表結構,元素的存取順序不能保證一致。
由於要保證鍵的唯一,不重複,需要重寫鍵的hashCode()和equals()方法。
LinkedHashMap<K, V>:HashMap下有個子類LinkedHashMap,儲存資料採用的雜湊表和連結串列結構。
通過連結串列結構可以保證元素的存取順序一致。
由於要保證鍵的唯一,不重複,需要重寫鍵的hashCode()和equals()方法。
public class MapDemo{
psvm{
}
/*
移除集合中的鍵值對,返回被移除之前的值
V remove(K)
*/
public static void func3(){
psvm{
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1,"a");
map.put(2,"d");
map.put(3,"c");
String value = map.remove(3);
sout(value);
String value = map.remove(4);
sout(value); //返回null,並且沒有移除成功
}
}
/*
通過鍵物件,獲取值物件
V get(K)
*/
public static void func2(){
psvm{
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1,"a");
map.put(2,"d");
map.put(3,"c");
String value = map.get(1);
sout(value);
String value = map.get(4);
sout(value); //結果為null
}
}
/*
將鍵值對儲存到集合中
V put(K, V)
*/
public static void func(){
//建立集合物件,hashmap
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("a",1);
map.put("b",2);
map.put("c",3);
map.put("c",5); //重複的鍵會把原來的值覆蓋掉,不允許出現重複鍵
Integer i= map.put("d",6);
sout(i); //返回值一般情況下返回null,儲存重複鍵的時候,返回被覆蓋之前的值
sout(map);
}
}
Map集合的遍歷
利用鍵獲取值
Map介面中定義方法keySet
所有的鍵,儲存到Set集合
public class MapDemo1(){
psvm{
//1、利用Map集合的方法keySet,所有的鍵儲存到Set集合中
//2、遍歷Set集合,獲取出Set集合中的所有元素(Map中的鍵)
//3、呼叫map集合方法get,通過鍵獲取到值
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("a",1);
map.put("b",2);
map.put("c",3);
Set<String> set = map.keySet();
//此Set是HashMap中的內部類KeySet
//1
Iterator<String> it = set.iterator();
while(it.hasNext()){
sout(map.get(it.next()));
}
//2
for(String key : set){
sout(map.get(key));
}
//3
for(String key : map.keySet()){
sout(map.get(key));
}
}
}
Map中的Entry物件
/*
Map集合獲取方式
entrySet方法,鍵值對對映關係(結婚證)獲取
實現步驟:
1、呼叫map集合方法entrySet()將集合中的對映關係物件,儲存到Set集合
Set<Entry<K, V>>
2、迭代Set集合
3、獲取出的Set結合的元素,是對映關係物件
4、通過對映關係物件方法getKey,getValue獲取鍵值對
*/
public class MapDemo2(){
psvm{
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");
Set<Map.Entry<Integer, String>> set = map.entrySet();
Iterator<Map.Entry<Integer, String>> it = set.iterator();
while(it.hasNext()){
Map.Entry<Integer, String> entry = it.next();
sout(entry.getKey()+"...."+entry.getValue());
}
for(Map.Entry<Integer, String> entry : map.entrySet()){
sout(entry.getKey()+"...."+entry.getValue());
}
}
注意:Iterable 介面下沒有map集合,所以map不能用增強for迴圈
HashMap
/*
利用HashMap集合,儲存自定義的物件
自定義物件,作為鍵出現,作為值出現
*/
public class HashMapDemo{
psvm{
}
/*
HashMap儲存自定義的物件Person,作為值出現
*/
public static void func(){
HashMap<String, Person> map = new HashMap<String, Person>();
map.put("a",new Person("a",11));
map.put("b",new Person("b",12));
map.put("c",new Person("c",13));
for(String key : map.keySet()){
Person p = map.get(key);
sout(key+"...."+p);
}
}
}
public class Person{
private int age;
private String name;
public Person(){
}
public Person(String name, int age){
this.name = name;
this.age = age;
}
getter
setter
@Override
public String toString(){
return "Person"+"..."+name+"..."+age;
}
//當Person作為map的鍵時,為了保證鍵的唯一性,必須重寫hashCode()和equals()方法。
}
LinkedHashMap
/*
LinkedHashMap繼承HashMap
保證迭代的順序
*/
public class LinkedHashMapDemo{
psvm{
LinkedHashMap<String, String> link = LinkedHashMap<String, String>();
link.put("a","1");
link.put("b","2");
link.put("c","3");
link.put("d","4");
sout(link); //怎麼存進去,就會怎麼取出來
}
}
HashTable
/*
Map介面實現類 HashTable
底層資料結構雜湊表,特點和hashMap時一樣的
HashTable執行緒安全,執行速度慢
HashMap執行緒不安全,執行速度快
HashTable命運和Vector一樣
HashMap 允許儲存null值,null鍵
HashTable 不允許儲存null值,null鍵
HashTable的子類,Properties,依然活躍在開發舞臺
*/