使用Map
import java.util.HashMap;
import java.util.Map;
public class Collection{
public static void main(String[] args) {
Student s = new Student("xiao shuai",99);
Map<String, Student> map = new HashMap<>();
map.put("xiao shuai",s); // 将“xiao shuai”和Student实例映射并关联
Student target = map.get("xiao shuai");
System.out.println(target == s); // true, 同一个实例
System.out.println(target.score); // 99
Student another = map.get("Bob"); // 通过另一个key查找
System.out.println(another); // 没有找到返回null
}
}
class Student{
public String name;
public int score;
public Student(String name,int score){
this.name = name;
this.score = score;
}
}
// Map的语法规则
import java.util.HashMap;
import java.util.Map;
public class Collection{
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
// 一个key对应多个value就会被覆盖
//map.put("apple",123);
//map.put("pear",456);
//System.out.println(map.get("apple")); // 123
//map.put("apple",789); // 再次放入apple作为key,但value变成了789
//System.out.println(map.get("apple")); // 789
// 一个value可以对应多个key
map.put("apple",123);
map.put("shuai",456);
System.out.println(map.get("apple")); // 123
System.out.println(map.get("shuai")); // 456
}
}
遍历Map
// 可以通过for each遍历keySet()
import java.util.HashMap;
import java.util.Map;
public class Collection{
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("apple",123);
map.put("banana",518);
map.put("purple",666);
for (String key : map.keySet()){
Integer value = map.get(key);
System.out.println(key + " = " + value);
}
}
}
// 也可以通过for each遍历entrySet(),直接获取key-value。
public class Collection {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("apple", 123);
map.put("pear", 456);
map.put("banana", 789);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " = " + value);
}
}
}
编写equals和hashCode
/*
要正确使用HashMap,作为key的类必须正确覆写equals()和hashCode()方法;
一个类如果覆写了equals(),就必须覆写hashCode(),并且覆写规则是:
如果equals()返回true,则hashCode()返回值必须相等;
如果equals()返回false,则hashCode()返回值尽量不要相等。
实现hashCode()方法可以通过Objects.hashCode()辅助方法实现。
注意:String内部封装的有equals和hashCode,所以不用重写
*/
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class Collection2{
public static void main(String[] args) {
Person p1 = new Person("shuai",21);
Map<Person,Integer> map = new HashMap<>();
map.put(p1,123);
Person p2 = new Person("shuai",21);
System.out.println(p1 == p2);
System.out.println(p1.equals(p2));
System.out.println(map.get(p1));
System.out.println(map.get(p2));
}
}
class Person{
String name;
int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
// 编写equals
public boolean equals(Object obj) {
if (obj instanceof Person) {
Person p = (Person) obj;
return Objects.equals(this.name, p.name) && this.age == p.age;
}
return false;
}
// 编写hashCode
public int hashCode() {
return Objects.hash(name, age);
}
}
使用TreeMap
import java.time.DayOfWeek;
import java.util.*;
public class Collection2 {
public static void main(String[] args) {
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));
}
}
/*
如果Map的key是enum类型,推荐使用EnumMap,既保证速度,也不浪费空间。
使用EnumMap的时候,根据面向抽象编程的原则,应持有Map接口。
*/
使用TreeMap
Map<String, Integer> map = new TreeMap<>();
// TreeMap 根据key的字符进行排序
// key的自定义排序
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
public class Collection2{
public static void main(String[] args) {
Map<Student, Integer> map = new TreeMap<>(new Comparator<Student>() {
@Override
public int compare(Student p1, Student p2) {
// 按姓名进行排序
//return p1.name.compareTo(p2.name);
// 按分数进行排序
// 官方规定在两个数据相等的时候,需要返回0,
// 不然的话TreeMap将不能正常工作,map.get()的数据为null
if (p1.score == p2.score){
return 0;
}
/*注意到Comparator接口要求实现一个比较方法,它负责比较传入的两个元素a和b,
如果a<b,则返回负数,通常是-1,如果a==b,则返回0,
如果a>b,则返回正数,通常是1
*/
return p1.score > p2.score ? -1 : 1;
}
});
map.put(new Student("Tom",99),1);
map.put(new Student("shuai",100),2);
map.put(new Student("Lily",88),3);
for (Student key : map.keySet()){
System.out.println(key);
}
System.out.println(map.get(new Student("shuai",100)));
}
}
class Student{
String name;
int score;
Student(String name,int score){
this.name = name;
this.score = score;
}
public String toString(){
//return "{Person: " + name + "}";
return String.format("{%s: score=%d}",name,score);
}
}