首页 > 编程语言 >27 | JAVA集合TreeMap(Map接口下除HashMap实现的另一种实现)

27 | JAVA集合TreeMap(Map接口下除HashMap实现的另一种实现)

时间:2022-09-02 08:58:55浏览次数:60  
标签:Map 27 JAVA name map TreeMap Person Key new

TreeMap

我们已经知道,HashMap是一种以空间换时间的映射表,它的实现原理决定了内部的Key是无序的,即遍历HashMap的Key时,其顺序是不可预测的(但每个Key都会遍历一次且仅遍历一次)。

还有一种Map,它在内部会对Key进行排序,这种Map就是SortedMap。注意到SortedMap是接口,它的实现类是TreeMap

       ┌───┐
       │Map│
       └───┘
         ▲
    ┌────┴─────┐
    │          │
┌───────┐ ┌─────────┐
│HashMap│ │SortedMap│
└───────┘ └─────────┘
               ▲
               │
          ┌─────────┐
          │ TreeMap │
          └─────────┘

SortedMap保证遍历时以Key的顺序来进行排序。例如,放入的Key是"apple""pear""orange",遍历的顺序一定是"apple""orange""pear",因为String默认按字母排序:

使用TreeMap时,放入的Key必须实现Comparable接口。StringInteger这些类已经实现了Comparable接口,因此可以直接作为Key使用。作为Value的对象则没有任何要求。

如果作为Key的class没有实现Comparable接口,那么,必须在创建TreeMap时同时指定一个自定义排序算法:比如

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Map<Person, Integer> map = new TreeMap<>(new Comparator<Person>() {
            public int compare(Person p1, Person p2) {
                return p1.name.compareTo(p2.name);
            }
        });
        map.put(new Person("Tom"), 1);
        map.put(new Person("Bob"), 2);
        map.put(new Person("Lily"), 3);
        for (Person key : map.keySet()) {
            System.out.println(key);
        }
        // {Person: Bob}, {Person: Lily}, {Person: Tom}
        System.out.println(map.get(new Person("Bob"))); // 2
    }
}

class Person {
    public String name;
    Person(String name) {
        this.name = name;
    }
    public String toString() {
        return "{Person: " + name + "}";
    }
}

注意到Comparator接口要求实现一个比较方法,它负责比较传入的两个元素ab,如果a<b,则返回负数,通常是-1,如果a==b,则返回0,如果a>b,则返回正数,通常是1TreeMap内部根据比较结果对Key进行排序。

注意到Person类并未覆写equals()hashCode()因为TreeMap不使用equals()hashCode()

TreeMap在比较两个Key是否相等时,依赖Key的compareTo()方法或者Comparator.compare()方法。在两个Key相等时,必须返回0

联想:在C++中,是可以构建一个结构体,结构体内包含有 operator () 方法,我们可以通过该结构体进行可调用对象的创建,并且传入 map构造函数。

标签:Map,27,JAVA,name,map,TreeMap,Person,Key,new
From: https://www.cnblogs.com/mmxingye/p/16648537.html

相关文章

  • 28 | JAVA集合Properties专门用来存取配置文件(底层仍为哈希表)
    使用Properties配置文件的特点是,它的Key-Value一般都是String-String类型的,因此我们完全可以用Map<String,String>来表示它由于历史遗留原因,Properties内部本质上是一......
  • 29 | JAVA集合Set(一种接口,Map的同级映射)
    Set如果我们只需要存储不重复的key,并不需要存储映射的value,那么就可以使用Set。Set用于存储不重复的元素集合,它主要提供以下几个方法:将元素添加进Set<E>:booleanadd(E......
  • 30 | JAVA集合Queue(一种接口,实现为LinkedList)
    Queue队列(Queue)是一种经常使用的集合。Queue实际上是实现了一个先进先出(FIFO:FirstInFirstOut)的有序表。它和List的区别在于,List可以在任意位置添加和删除元素,而Queue只......
  • 21 | JAVA注解
    注解什么是注解(Annotation)?注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释”:Java的注解可以分为三类:第一类是由编译器使用的注解,例如:@Override:让编译器检......
  • 22 | JAVA泛型基础
    初步认识ArrayList<>ArrayListArrayList一种模板:ArrayList<T>,代码如下:publicclassArrayList<T>{privateT[]array;privateintsize;publicvoida......
  • 23 | JAVA集合简介(C++容器)
    集合简介C++中将容器分成三类:顺序、关联、hash。容器在JAVA中映射为集合。等号左边(接口)等号右边(实现)ListArrayList/LinkedListSetHashSet/TreeSet......
  • 24 | JAVA集合之List(实际为接口)
    使用List在集合类中,List是最基础的一种集合:它是一种有序列表。List下的两种具体实现ArrayList和LinkedList,本别对应数组和链表。List的接口List<E>接口在末......
  • 25 | JAVA集合Map(实际为接口)
    使用MapMap这种键值(key-value)映射表的数据结构,作用就是能高效通过key快速查找value(元素)。Map也是一个接口,最常用的实现类是HashMap。containsKey(Kkey)方法put()ge......
  • 26 | JAVA集合EnumMap(Map的针对枚举类的一种特殊实现,接口仍为Map)
    EnumMap如果作为key的对象是enum类型,那么,还可以使用Java集合库提供的一种EnumMap,它在内部以一个非常紧凑的数组存储value,并且根据enum类型的key直接定位到内部数组的索引,......
  • 17 | JAVA反射之调用方法
    反射调用方法获得Method对象我们已经能通过Class实例获取所有Field对象,同样的,可以通过Class实例获取所有Method信息。Class类提供了以下几个方法来获取Method:Method......