Map集合
- 2021 年 11 月 28 日
- 筆記
- JavaSE
Map集合
Map集合概述
- java.util.Map<k,v>集合
- Map集合的特點:
- Map集合是一個雙列集合,一個元素包含兩個值(一個key,一個value)
- Map集合中的元素,key和value的數據類型可以相同,也可以不同
- Map集合中的元素,key是不允許重複的,value是可以重複的
- Map集合中的元素,key和value是一一對應的
- java.util.HashMap<k,v>集合 implements Map<k,v>介面
- HashMap集合的特點:
1. HashMap集合底層是哈希表:查詢的速度特別的快
JDK1.8之前:數組+單向鏈表
JDK1.8之後:數組+單向鏈表/紅黑樹(鏈表的長度超過8):提高查詢的速度
1. HashMap集合是一個無序的集合,存儲元素和取出元素的順序有可能不一致
java.util.LinkedHashMap<k,v>集合 extends HashMap<k,v>集合
- LinkedHashMap集合的特點:
- LinkedHashMap集合底層是哈希表+鏈表(保證迭代的順序)
- LinkedHashMap集合是一個有序的集合,存儲元素和取出元素的順序是一致的

Map介面中的常用方法
import java.util.HashMap;
import java.util.Map;
/*
java.util.Map<k,v>集合
Map集合的特點:
1.Map集合是一個雙列集合,一個元素包含兩個值(一個key,一個value)
2.Map集合中的元素,key和value的數據類型可以相同,也可以不同
3.Map集合中的元素,key是不允許重複的,value是可以重複的
4.Map集合中的元素,key和value是一一對應的
java.util.HashMap<k,v>集合 implements Map<k,v>介面
HashMap集合的特點:
1.HashMap集合底層是哈希表:查詢的速度特別的快
JDK1.8之前:數組+單向鏈表
JDK1.8之後:數組+單向鏈表/紅黑樹(鏈表的長度超過8):提高查詢的速度
2.HashMap集合是一個無序的集合,存儲元素和取出元素的順序有可能不一致
java.util.LinkedHashMap<k,v>集合 extends HashMap<k,v>集合
LinkedHashMap的特點:
1.LinkedHashMap集合底層是哈希表+鏈表(保證迭代的順序)
2.LinkedHashMap集合是一個有序的集合,存儲元素和取出元素的順序是一致的
*/
public class Demo01Map {
public static void main(String[] args) {
show01();
show02();
show03();
show04();
}
/*
boolean containKey(Object key) 判斷集合中是否包含指定的鍵
包含返回true,不包含返回false
*/
private static void show04() {
//創建Map集合對象
Map<String,Integer> map = new HashMap<>();
map.put("趙麗穎",168);
map.put("楊穎",165);
map.put("林志玲",178);
boolean b1 = map.containsKey("趙麗穎");
System.out.println("b1:"+b1);//b1:true
boolean b2 = map.containsKey("趙穎");
System.out.println("b2:"+b2);//b2:false
}
/*
public V get(Object key) 根據指定的鍵,在Map集合中獲取對應的值
返回值:
key存在,返回對應的value值
key不存在,返回null
*/
private static void show03() {
//創建Map集合對象
Map<String,Integer> map = new HashMap<>();
map.put("趙麗穎",168);
map.put("楊穎",165);
map.put("林志玲",178);
Integer v1 = map.get("楊穎");
System.out.println("v1:"+v1);//v1:165
Integer v2 = map.get("迪麗熱巴");
System.out.println(v2);//null
}
/*
public V remove(Object key):把指定的鍵 所對應的鍵值對元素 在Map集合中刪除,返回被刪除元素的值
返回值:V
key存在,v返回被刪除的值
key不存在,v返回null
*/
private static void show02() {
//創建Map集合對象
Map<String,Integer> map = new HashMap<>();
map.put("趙麗穎",168);
map.put("楊穎",165);
map.put("林志玲",178);
System.out.println(map);//{林志玲=178, 趙麗穎=168, 楊穎=165}
Integer v1 = map.remove("林志玲");
System.out.println("v1:"+v1);//v1:178
System.out.println(map);//{趙麗穎=168, 楊穎=165}
//int v2 = map.remove("林志穎");//自動拆箱 NullPointerException
Integer v2 = map.remove("林志穎");
System.out.println("v2:"+v2);//v2:null
System.out.println(map);//{趙麗穎=168, 楊穎=165}
}
/*
public V put(K key, V value):把指定的鍵與指定的值添加到Map集合中
返回值:v
存儲鍵值對的時候,key不重複,返回值v是null
存儲鍵值對的時候,key重複,會使用新的value替換map中重複的value,返回被替換的value值
*/
private static void show01() {
//創建Map集合對象,多態
Map<String,String> map = new HashMap<>();
String v1 = map.put("李晨", "范冰冰1");
System.out.println("v1:"+v1);//v1:null
String v2 = map.put("李晨", "范冰冰2");
System.out.println("v2:"+v2);//v2:范冰冰1
System.out.println(map);//{李晨=范冰冰2}
map.put("冷鋒","龍小雲");
map.put("楊過","小龍女");
map.put("尹志平","小龍女");
System.out.println(map);//{楊過=小龍女, 尹志平=小龍女, 李晨=范冰冰2, 冷鋒=龍小雲}
}
}
Map集合遍歷方式
1. 通過鍵找值的方式

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/*
Map集合的第一種遍歷方式:通過鍵找值的方式
Map集合中的方法:
Set<K> keySet() 返回此映射中包含的鍵的Set視圖
實現步驟:
1.使用Map集合中的方法keySet(),把Map集合所有的key取出來,存儲到一個Set集合中
2.遍歷Set集合,獲取Map集合中的每一個key
3.通過Map集合中的方法get(key),通過key找到value
*/
public class Demo02KeySet {
public static void main(String[] args) {
//創建Map集合對象
Map<String,Integer> map = new HashMap<>();
map.put("趙麗穎",168);
map.put("楊穎",165);
map.put("林志玲",178);
//1.使用Map集合中的方法keySet(),把Map集合所有的key取出來,存儲到一個Set集合中
Set<String> set = map.keySet();
//2.遍歷Set集合,獲取Map集合中的每一個key
//使用迭代器遍歷Set集合
Iterator<String> it = set.iterator();
while (it.hasNext()){
String key = it.next();
//3.通過Map集合中的方法get(key),通過key找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
System.out.println("=================================");
//使用增強for遍歷Set集合
//for (String key : set) {
for (String key : map.keySet()) {//將set集合簡化,直接使用map集合創建set集合進行遍歷
//3.通過Map集合中的方法get(key),通過key找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
}
}
2. Entry鍵值對對象

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/*
Map集合遍歷的第二種方式:使用Entry對象遍歷
Map集合中的方法:
Set<Map.Entry<K,v>> entrySet() 返回此映射中包含的映射關係的Set視圖
實現步驟:
1.使用Map集合中的方法entrySet(),把Map集合中多個Entry對象取出來,存儲到一個Set集合中
2.遍歷Set集合,獲取每一個Entry對象
3.使用Entry對象中的方法getKey()和getValue()獲取鍵與值
*/
public class Demo03EntrySet {
public static void main(String[] args) {
//創建Map集合對象
Map<String,Integer> map = new HashMap<>();
map.put("趙麗穎",168);
map.put("楊穎",165);
map.put("林志玲",178);
//1.使用Map集合中的方法entrySet(),把Map集合中多個Entry對象取出來,存儲到一個Set集合中
Set<Map.Entry<String, Integer>> set = map.entrySet();
//2.遍歷Set集合,獲取每一個Entry對象
//使用迭代器遍歷Set集合
Iterator<Map.Entry<String, Integer>> it = set.iterator();
while (it.hasNext()){
Map.Entry<String, Integer> entry = it.next();
//3.使用Entry對象中的方法getKey()和getValue()獲取鍵與值
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"="+value);
}
System.out.println("================================");
//使用增強for循環遍歷Set集合
for (Map.Entry<String, Integer> entry : set) {
//3.使用Entry對象中的方法getKey()和getValue()獲取鍵與值
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"="+value);
}
}
}
HashMap存儲自定義類型鍵值
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
HashMap存儲自定義類型鍵值
Map集合保證key是唯一的:
作為key的元素,必須重寫hashCode方法和equals方法,以保證key唯一
*/
public class Demo01HashMapSavePerson {
public static void main(String[] args) {
show01();
show02();
}
/*
HashMap存儲自定義類型鍵值
key:Person類型
Person類就必須重寫hashCode方法和equals方法,以保證key唯一
value:String類型
可以重複
*/
private static void show02() {
//創建HashMap集合
HashMap<Person, String> map = new HashMap<>();
//往集合中添加元素
map.put(new Person("女王",18),"英國");
map.put(new Person("秦始皇",18),"秦國");
map.put(new Person("普京",30),"俄羅斯");
map.put(new Person("女王",18),"模里西斯");
//使用entrySet和增強for遍歷Map集合
Set<Map.Entry<Person, String>> set = map.entrySet();
for (Map.Entry<Person, String> entry : set) {
Person key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"-->"+value);
}
}
/*
HashMap存儲自定義類型鍵值
key:String類型
String類重寫hashCode方法和equals方法,可以保證key唯一
value:Person類型
value可以重複(同名同年齡的人視為同一個)
*/
private static void show01() {
//創建HashMap集合
HashMap<String, Person> map = new HashMap<>();
//往集合中添加元素
map.put("北京",new Person("張三",18));
map.put("上海",new Person("李四",19));
map.put("廣州",new Person("王五",20));
map.put("北京",new Person("趙六",18));
//使用keySet加增強for遍歷map集合
Set<String> set = map.keySet();
for (String key : set) {
Person value = map.get(key);
System.out.println(key+"-->"+value);
}
}
}
==========================================================
import java.util.Objects;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) { //當鍵的類型為Person時需要重寫hashCode與equals
if (this == o) return true; //當鍵的類型為String時不需重寫hashCode與equals,String類型默認重寫
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
LinkedHashMap集合
import java.util.HashMap;
import java.util.LinkedHashMap;
/*
java.util.LinkedHashMap<K,V> extends HashMap<K,V>
Map 介面的哈希表和鏈接列表實現,具有可預知的迭代順序
底層原理:
哈希表+鏈表(記錄元素的順序)
*/
public class Demo01LinkedHashMap {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("a","a");
map.put("c","c");
map.put("b","b");
map.put("a","d");
System.out.println(map);// key不允許重複,無序 {a=d, b=b, c=c}
LinkedHashMap<String, String> linked = new LinkedHashMap<>();
linked.put("a","a");
linked.put("c","c");
linked.put("b","b");
linked.put("a","d");
System.out.println(linked);// key不允許重複,有序 {a=d, c=c, b=b}
}
}
Hashtable集合
import java.util.HashMap;
import java.util.Hashtable;
/*
java.util.Hashtable<K,V>集合 implements Map<K,V>介面
Hashtable:底層也是一個哈希表,是一個執行緒安全的集合,是單執行緒集合,速度慢
HashMap:底層也是一個哈希表,是一個執行緒不安全的集合,是多執行緒集合,速度快
HashMap集合(之前學的所有的集合):可以存儲null值,null鍵
Hashtable集合,不能存儲null值,null鍵
Hashtable和Vector集合一樣,在jdk1.2版本之後被更先進的集合(HashMap,ArrayList)取代了
Hashtable的子類Properties依然活躍在歷史舞台
Properties集合是唯一和IO流相結合的集合
*/
public class Demo02Hashtable {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put(null,"a");
map.put("a",null);
map.put(null,null);
System.out.println(map);//{null=null, a=null}
Hashtable<String,String> table = new Hashtable<>();
//table.put(null,"a");//NullPointerException
//table.put("b",null);//NullPointerException
table.put(null,null);//NullPointerException
}
}