使用Map

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. public class Collection{
  4. public static void main(String[] args) {
  5. Student s = new Student("xiao shuai",99);
  6. Map<String, Student> map = new HashMap<>();
  7. map.put("xiao shuai",s); // 将“xiao shuai”和Student实例映射并关联
  8. Student target = map.get("xiao shuai");
  9. System.out.println(target == s); // true, 同一个实例
  10. System.out.println(target.score); // 99
  11. Student another = map.get("Bob"); // 通过另一个key查找
  12. System.out.println(another); // 没有找到返回null
  13. }
  14. }
  15. class Student{
  16. public String name;
  17. public int score;
  18. public Student(String name,int score){
  19. this.name = name;
  20. this.score = score;
  21. }
  22. }
  23. // Map的语法规则
  24. import java.util.HashMap;
  25. import java.util.Map;
  26. public class Collection{
  27. public static void main(String[] args) {
  28. Map<String, Integer> map = new HashMap<>();
  29. // 一个key对应多个value就会被覆盖
  30. //map.put("apple",123);
  31. //map.put("pear",456);
  32. //System.out.println(map.get("apple")); // 123
  33. //map.put("apple",789); // 再次放入apple作为key,但value变成了789
  34. //System.out.println(map.get("apple")); // 789
  35. // 一个value可以对应多个key
  36. map.put("apple",123);
  37. map.put("shuai",456);
  38. System.out.println(map.get("apple")); // 123
  39. System.out.println(map.get("shuai")); // 456
  40. }
  41. }

遍历Map

  1. // 可以通过for each遍历keySet()
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class Collection{
  5. public static void main(String[] args) {
  6. Map<String, Integer> map = new HashMap<>();
  7. map.put("apple",123);
  8. map.put("banana",518);
  9. map.put("purple",666);
  10. for (String key : map.keySet()){
  11. Integer value = map.get(key);
  12. System.out.println(key + " = " + value);
  13. }
  14. }
  15. }
  16. // 也可以通过for each遍历entrySet(),直接获取key-value。
  17. public class Collection {
  18. public static void main(String[] args) {
  19. Map<String, Integer> map = new HashMap<>();
  20. map.put("apple", 123);
  21. map.put("pear", 456);
  22. map.put("banana", 789);
  23. for (Map.Entry<String, Integer> entry : map.entrySet()) {
  24. String key = entry.getKey();
  25. Integer value = entry.getValue();
  26. System.out.println(key + " = " + value);
  27. }
  28. }
  29. }

编写equals和hashCode

  1. /*
  2. 要正确使用HashMap,作为key的类必须正确覆写equals()和hashCode()方法;
  3. 一个类如果覆写了equals(),就必须覆写hashCode(),并且覆写规则是:
  4. 如果equals()返回true,则hashCode()返回值必须相等;
  5. 如果equals()返回false,则hashCode()返回值尽量不要相等。
  6. 实现hashCode()方法可以通过Objects.hashCode()辅助方法实现。
  7. 注意:String内部封装的有equals和hashCode,所以不用重写
  8. */
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. import java.util.Objects;
  12. public class Collection2{
  13. public static void main(String[] args) {
  14. Person p1 = new Person("shuai",21);
  15. Map<Person,Integer> map = new HashMap<>();
  16. map.put(p1,123);
  17. Person p2 = new Person("shuai",21);
  18. System.out.println(p1 == p2);
  19. System.out.println(p1.equals(p2));
  20. System.out.println(map.get(p1));
  21. System.out.println(map.get(p2));
  22. }
  23. }
  24. class Person{
  25. String name;
  26. int age;
  27. public Person(String name,int age){
  28. this.name = name;
  29. this.age = age;
  30. }
  31. // 编写equals
  32. public boolean equals(Object obj) {
  33. if (obj instanceof Person) {
  34. Person p = (Person) obj;
  35. return Objects.equals(this.name, p.name) && this.age == p.age;
  36. }
  37. return false;
  38. }
  39. // 编写hashCode
  40. public int hashCode() {
  41. return Objects.hash(name, age);
  42. }
  43. }

使用TreeMap

  1. import java.time.DayOfWeek;
  2. import java.util.*;
  3. public class Collection2 {
  4. public static void main(String[] args) {
  5. Map<DayOfWeek, String> map = new EnumMap<>(DayOfWeek.class);
  6. map.put(DayOfWeek.MONDAY, "星期一");
  7. map.put(DayOfWeek.TUESDAY, "星期二");
  8. map.put(DayOfWeek.WEDNESDAY, "星期三");
  9. map.put(DayOfWeek.THURSDAY, "星期四");
  10. map.put(DayOfWeek.FRIDAY, "星期五");
  11. map.put(DayOfWeek.SATURDAY, "星期六");
  12. map.put(DayOfWeek.SUNDAY, "星期日");
  13. System.out.println(map);
  14. System.out.println(map.get(DayOfWeek.MONDAY));
  15. }
  16. }
  17. /*
  18. 如果Map的key是enum类型,推荐使用EnumMap,既保证速度,也不浪费空间。
  19. 使用EnumMap的时候,根据面向抽象编程的原则,应持有Map接口。
  20. */

使用TreeMap

  1. Map<String, Integer> map = new TreeMap<>();
  2. // TreeMap 根据key的字符进行排序
  3. // key的自定义排序
  4. import java.util.Comparator;
  5. import java.util.Map;
  6. import java.util.TreeMap;
  7. public class Collection2{
  8. public static void main(String[] args) {
  9. Map<Student, Integer> map = new TreeMap<>(new Comparator<Student>() {
  10. @Override
  11. public int compare(Student p1, Student p2) {
  12. // 按姓名进行排序
  13. //return p1.name.compareTo(p2.name);
  14. // 按分数进行排序
  15. // 官方规定在两个数据相等的时候,需要返回0,
  16. // 不然的话TreeMap将不能正常工作,map.get()的数据为null
  17. if (p1.score == p2.score){
  18. return 0;
  19. }
  20. /*注意到Comparator接口要求实现一个比较方法,它负责比较传入的两个元素a和b,
  21. 如果a<b,则返回负数,通常是-1,如果a==b,则返回0,
  22. 如果a>b,则返回正数,通常是1
  23. */
  24. return p1.score > p2.score ? -1 : 1;
  25. }
  26. });
  27. map.put(new Student("Tom",99),1);
  28. map.put(new Student("shuai",100),2);
  29. map.put(new Student("Lily",88),3);
  30. for (Student key : map.keySet()){
  31. System.out.println(key);
  32. }
  33. System.out.println(map.get(new Student("shuai",100)));
  34. }
  35. }
  36. class Student{
  37. String name;
  38. int score;
  39. Student(String name,int score){
  40. this.name = name;
  41. this.score = score;
  42. }
  43. public String toString(){
  44. //return "{Person: " + name + "}";
  45. return String.format("{%s: score=%d}",name,score);
  46. }
  47. }