Java集合框架15:Map集合
Map介紹
1、將值對映到值的物件。
2、一個對映不能包含重複的鍵。
3、每個鍵最多隻能對映到一個值。
Map介面和Collection介面的不同
1、Map是雙列的,Collection是單列的。
2、Map的鍵唯一,Collection的子體系Set是唯一的。
3、Map集合的資料結構值針對鍵有效,跟值無關;Collection集合的資料結構是針對元素有效。
Map介面定義的方法
1、void clear():刪除該Map物件中的所有key-value對。
2、boolean containsKey(Object key):查詢Map中是否包含指定的key,如果包含返回true。
3、boolean containsValue(Object value):查詢Map中是否包含一個或多個value,如果包含則返回true。
4、Set entrySet():返回Map中包含的key-value對所組成的Set集合,每個集合元素都是Map.Entry物件。
5、Object get(Object key):返回指定key所對應的value;如果此Map中不包含該key,則返回null。
6、boolean isEmpty():查詢該Map是否為空,如果為空則返回true。
7、Set keySet():返回該Map中所有key組成的Set集合。
8、Object put(Object key,Object value):新增一個key-value對,如果當前Map中已有一個與該key相等的key-value對,則新的key-value對會覆蓋原來的key-value對。
9、void putAll(Map m):將指定Map中的key-value對複製到本Map中。
10、Object remove(Object key):刪除指定key所對應的key-value對,返回被刪除key所關聯的value,如果該key不存在,則返回null。
11、boolean remove(Object key,Object value):這是Java8新增的方法,刪除指定key、value所對應的key-value對。刪除成功返回true,否則返回false。
12、int size():返回該Map裡的key-value對的個數。
13、Collection values():返回該Map裡所有value組成的Collection。
package map; import java.util.Collection; import java.util.HashMap; import java.util.Map; public class Dmeo1_Map { /** * A:Map集合的功能概述 * a:新增功能 * V put(K key,V value):新增元素 * 如果鍵是第一次儲存,就直接儲存元素,返回null * 如果鍵不是第一次存在,就用值把以前的值替換掉,返回以前的值 * b:刪除功能 * void clear() :移除所有的鍵值對元素 * V remove(Object key):根據鍵刪除鍵值對元素,並把值返回 * c:判斷功能 * boolean containsKey(Object key):判斷集合是否包含指定的鍵 * boolean containsValue(Object value):判斷集合是否包含指定的值 * boolean isEmpty():判斷集合是否為空 * d:獲取功能 * Set<Map.Entry<K,V> entrySet(); * V get(Object key):根據鍵獲取值 * Set<K> keySet():獲取集合中所有鍵的集合 * Collection<V> values():獲取集合中所有值的集合 * e:長度功能 * int size():返回集合中的鍵值對的個數 * * 注意:map集合是不可以直接迭代的 */ public static void main(String[] args) { Map<String,Integer> map = new HashMap<>(); Integer i1 = map.put("張三", 23); Integer i2 = map.put("李四", 24); Integer i3 = map.put("王武", 25); Integer i4 = map.put("趙六", 26); /*Integer i5 = map.put("張三", 26);//相同的鍵不儲存,值覆蓋,把被覆蓋的值返回 System.out.println(map); Integer value= map.remove("張三");// 根據鍵刪除元素,返回鍵對應的值 System.out.println(value);*/ System.out.println(map.containsKey("張三"));//判斷是否包含傳入的鍵 System.out.println(map.containsValue(100));//判斷是否包含傳入的值 /*Collection<Integer> c = map.values(); System.out.println(c); System.out.println(map.size()); System.out.println(c.size());*/ } }
map的遍歷
(1)第一種方式:
package map; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Demo2_Iterator { /** * 通過檢視Map集合的api發現沒有iterator方法,那麼雙列集合如何跌該呢? */ public static void main(String[] args) { Map<String,Integer> map = new HashMap<>(); map.put("張三", 23); map.put("李四", 24); map.put("王五", 25); map.put("趙六", 26); /*Integer i = map.get("張三"); System.out.println(i);*/ //獲取所有的鍵 /*Set<String> keySet = map.keySet();//獲取所有鍵的集合 Iterator<String> it = keySet.iterator();//獲取迭代器 while(it.hasNext()) { //判斷集合中是否有元素 String key = it.next(); //獲取每一個鍵 Integer value = map.get(key); //根據鍵獲取值 System.out.println(key + ":" + value); }*/ //使用增強for迴圈進行遍歷 for(String str : map.keySet()) {//map.ketSet()是所有鍵的集合 System.out.println(str + ":" + map.get(str)); } } }
(2)第二種方式
package map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Demo3_Iterator {
/**
* Map集合的第二種迭代,根據鍵值對物件,獲取鍵和值
* A:鍵值對物件找鍵和值的思路:
* 獲取所有鍵值對物件的集合
* 遍歷鍵值對物件的集合,獲取到每一個鍵值對物件
* 根據鍵值對物件找鍵和值
* @param args
*/
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("張三", 23);
map.put("李四", 24);
map.put("王五", 25);
map.put("趙六", 26);
//Map.Entry說明Entry是Map的內部介面,將鍵和值封裝成了Entry物件,並存儲在Set集合中
/*Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
//獲取每一個物件
Iterator<Map.Entry<String,Integer>> it = entrySet.iterator();
while(it.hasNext()) {
//獲取每一個Entry物件
Map.Entry<String, Integer> en = it.next();
String key = en.getKey(); //根據鍵值對物件獲取鍵
Integer value = en.getValue(); //根據鍵值對物件獲取值
System.out.println(key + ":" + value);
}*/
for(Map.Entry<String, Integer> en : map.entrySet()) {
System.out.println(en.getKey() + ":" + en.getValue());
}
}
}
HashMap示例演示
package map;
import java.util.HashMap;
public class Demo5_HashMap {
/*
* A:案例演示
* HashMap集合鍵是Student值是String的案例
* 鍵是學生物件,代表一個學生
* 值是字串物件,代表學生歸屬地
*/
public static void main(String[] args){
HashMap<Student,String> hm = new HashMap<>();
hm.put(new Student("張三",23), "北京");
hm.put(new Student("張三",23),"上海");
hm.put(new Student("李四",24), "廣州");
hm.put(new Student("王五",25),"北京");
System.out.println(hm);
}
}
LinkedHashMap示例演示
package map;
import java.util.LinkedHashMap;
public class Demo6_LinkedHashMap {
/**
* LinkedHashMap保證了怎麼存就怎麼取
* @param args
*/
public static void main(String[] args) {
LinkedHashMap<String,Integer> lhm = new LinkedHashMap<>();
lhm.put("張三", 23);
lhm.put("李四", 24);
lhm.put("趙六", 26);
lhm.put("王五", 25);
System.out.println(lhm);
}
}
TreeMap示例演示
package map;
import java.util.TreeMap;
importjava.util.Comparator;
public class Dmeo7_TreeMap {
/**
* TreeMap集合鍵是Student值是String的案例
* @param args
*/
public static void main(String[] args) {
TreeMap<Student,String> tm = new TreeMap<>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int num = s1.getName().compareTo(s2.getName()); //按照姓名比較
return num == 0 ? s1.getAge() - s2.getAge() : num;
}
});
tm.put(new Student("張三",23), "北京");
tm.put(new Student("李四",13), "上海");
tm.put(new Student("王五",33), "廣州");
System.out.println(tm);
}
public void demo() {
TreeMap<Student,String> tm = new TreeMap<>();
tm.put(new Student("張三",23), "北京");
tm.put(new Student("李四",13), "上海");
tm.put(new Student("王五",33), "廣州");
System.out.println(tm);
}
}
統計字串中每個字元出現的次數
package map;
import java.util.HashMap;
public class Test1 {
/**
* A:案例演示
* 需求:統計字串中每個字元出現的次數
*
* 分析:
* 1,定義一個需要被統計字元的字串
* 2,將字串轉換為字元陣列
* 3,定義雙列集合,儲存字串中字元以及字元出現的次數
* 4,遍歷字元陣列獲取一個字元,並將字元儲存在雙列集合中
* 5,儲存過程中要判斷,如果集合中不包含這個鍵,就將該字元當作鍵,值為1儲存,如果集合中包含這個鍵,就將值加1儲存
* 6,列印雙列集合中獲取字元出現的次數
*/
public static void main(String[] args) {
//1,定義一個需要被統計字元的字串
String s = "aaaabbbbbbccccccccccccccccccccccc";
//2,將字串轉換為字元陣列
char[] arr = s.toCharArray();
//3,定義雙列集合,儲存字串中字元以及字元出現的次數
HashMap<Character,Integer> hm = new HashMap<>();
//4,遍歷字元陣列獲取每一個字元,並將字串儲存在雙列集合中
for(char c : arr) {
//5,儲存過程中要判斷,如果集合中不包含這個鍵,就將該字元當作鍵,值為1儲存,如果集合中包含這個鍵,就將值加1儲存
/*if(!hm.containsKey(c)) {
hm.put(c,1);
} else {
hm.put(c, hm.get(c) + 1);
}*/
hm.put(c, !hm.containsKey(c) ? 1 : hm.get(c) + 1);
}
System.out.println(hm);
//6,列印雙列集合中獲取字元出現的次數
for(Character key : hm.keySet()) {//hm.keySet()代表所有鍵的集合
System.out.println(key + "=" + hm.get(key));//hm.get(key)根據鍵獲取值
}
}
}
HashMap和Hashtable的區別
package map;
import java.util.HashMap;
import java.util.Hashtable;
public class Demo9_Hashtable {
/**
* 面試題:
* HashMap和Hashtable的區別
* 共同點:
* 底層都是雜湊演算法,都是雙列集合
* 區別:
* 1,HashMap是執行緒不安全的,效率高,JDK1.2版本
* Hashtable是執行緒安全的,效率低,JDK1.0版本
* 2,HashMap可以儲存null鍵和null值
* Hashtable不可以儲存null鍵和null值
*/
public static void main(String[] args) {
HashMap<String,Integer> hm = new HashMap<>();
hm.put(null, 23);
hm.put("李四", null);
System.out.println(hm);
Hashtable<String,Integer> ht = new Hashtable<>();
ht.put("張三", null);
}
}