官方说明:https://docs.oracle.com/javase/tutorial/collections/interfaces/map.html


Map的特点:

  • A Map is an object that maps keys to values,each key can map to at most one value.
  • A map cannot contain duplicate keys
  • Map strengthens the requirements on the equals and hashCode methods so that two Map objects can be compared for logical equality without regard to their implementation types.
  • Two Map instances are equal if they represent the same key-value mappings.

包含三种通用的Map集合实现

  • HashMap

HashMap是基于哈希表实现的,是无序的,同时也是性能最好的,非线程安全。
HashMap所有的方法如下:
image.pngimage.png


  • TreeMap

TreeMap基于红黑树来实现的,非线程安全,存储的键值对可以根据Key进行自然排序或者定制排序,当使用自然排序的时候,key的类型需要实现equals() 和 compareTo(),如果使用定制排序,通过查看TreeMap的源码**private final **Comparator<? **super **K> **comparator**;则直接传递一个Comparator 对象给构造器即可,无需实现equals() 和 compareTo()。
TreeMap所有的方法如下:
image.pngimage.png


  • LinkedHashMap

LinkedHashMap是非线程安全的,可以按照元素插入的顺序进行排序。
LinkedHashMap所有的方法如下:
image.pngimage.png


总结:

  • HashMap:适用于在Map中插入、删除和定位元素,Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
  • 建议优先使用HashMap,在一些需要进行排序操作的时候才使用TreeMap。
  • HashMap允许Key为null值,但是只能有一个,其他的Map都不允许key为null

    扩展案例

    案例1:按照部门进行员工对象的分组
    1. Map<Department, List<Employee>> byDept = employees.stream()
    2. .collect(Collectors.groupingBy(Employee::getDepartment));
    案例2:计算各个部门员工的总薪水
    1. Map<Department, Integer> totalByDept = employees.stream().collect(
    2. Collectors.groupingBy(Employee::getDepartment,Collectors.summingInt(Employee::getSalary)));
    案例3:将学生按照是否通过进行分组
    1. Map<Boolean, List<Student>> passingFailing = students.stream().collect(
    2. Collectors.partitioningBy(s -> s.getGrade()>= PASS_THRESHOLD));
    案例4:按城市将人分组
    1. Map<String, List<Person>> peopleByCity
    2. = personStream.collect(Collectors.groupingBy(Person::getCity));
    案例5:双重Map,按省和市分组
    1. Map<String, Map<String, List<Person>>> peopleByStateAndCity
    2. = personStream.collect(Collectors.groupingBy(Person::getState,
    3. Collectors.groupingBy(Person::getCity)))