Map 是一种键值映射表,可以通过 key 快速查找对应的 value。
创建 Map
package com.chen.scanner;
import java.util.*;
public class TestMap {
public static void main(String[] args) {
Student s = new Student("Xiao Ming",99);
Map<String,Student> map = new HashMap<>();
map.put("Xiao Ming",s); //将 xiaoming 和 student 实例映射并关联
Student target = map.get("Xiao Ming");
System.out.println(target == s); //同一个实例
System.out.println(target.score);
Student another = map.get("Bob");
System.out.println(another); //未找到,返回 null
boolean isHave = map.containsKey("Bob");
System.out.println(isHave);
}
}
class Student {
public String name;
public int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
}
如果想查找某个 key 是否存在,可以调用 boolean containsKey(K key)方法。
注意:Map 中不存在重复的 key,对应的 value 可以重复。
遍历 Map
package com.chen.scanner;
import java.util.*;
public class TestMap {
public static void main(String[] args) {
Student xiaoming = new Student("Xiao Ming",99);
Student xiaoli = new Student("Xiao Li",100);
Map<String,Student> map = new HashMap<>();
map.put("xiao ming",xiaoming);
map.put("xiaoli",xiaoli);
//遍历 Map
for (String key: map.keySet()) {
int score = map.get(key).score;
System.out.println(key + " = " + score);
}
}
}
class Student {
public String name;
public int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
}
注意:遍历 Map 时,不可假设输出的 key 是有序的!
正确使用 Map 必须保证:
- 作为 key 的对象必须正确重写 equals()方法,相等的两个 key 实例调用 equals() 必须返回 true。
- 作为 key 的对象还必须重写 hashCode()方法,且 hashCode()方法要严格遵循以下规范:
a. 如果两个对象相等,则两个对象的 hashCode()必须相等。
b. 如果两个对象不相等,则两个对象的 hashCode()尽量不要相等。
hashCode()方法编写的越好,HashMap工作的效率就越高。
使用 EnumMap
Map<DayOfWeek,String> map = new EnumMap<>(DayOfWeek.class);
map.put(DayOfWeek.MONDAY,"星期一");
map.put(DayOfWeek.TUESDAY,"星期二");
map.put(DayOfWeek.WEDNESDAY,"星期三");
map.put(DayOfWeek.THURSDAY,"星期四");
map.put(DayOfWeek.FRIDAY,"星期五");
map.put(DayOfWeek.SATURDAY,"星期六");
map.put(DayOfWeek.SUNDAY,"星期天");
System.out.println(map);
System.out.println(map.get(DayOfWeek.MONDAY));
使用 TreeMap
我们已经知道,HashMap是一种以空间换时间的映射表,它的实现原理决定了内部的 key 是无序的,即遍历 HashMap的 key 时,其顺序是不可预测的。
SortedMap是接口,内部会对 key 进行排序,它的实现类是 TreeMap。
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("orange", 1);
map.put("apple", 2);
map.put("pear", 3);
for (String key : map.keySet()) {
System.out.println(key);
}
// apple, orange, pear
}
}
注意:使用 TreeMap 时,放入的 key 必须实现 Comparable接口。String,Integer这些类已经实现了该接口,因此可以直接作为 key 使用。作为 value 的对象则没有任何要求。