使用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); }}