SortedMap
接口,继承了Map接口。它是一个会对键值对,根据key进行排序的一种Map,要求存储的Key都实现了Comparable接口,或者该接口的实现类可以接收一种比较方法,代替key自身去实现的Comparable接口。同时要求存储的key在比较的时候不会出现ClassCastException异常,即key是同一种类型。
SortedMap基于Map接口扩展的方法如下:
- comparator,返回key的比较器,或者实现类接收到的比较器
- firstKey,返回排序后的第一个key
- lastKey,返回排序后的最后一个key
- headMap,返回Map中的key小于参数key的所有键值对,并生成一个Map
- tailMap,返回Map中key大于等于参数ley的所有键值对,并生成一个Map
- subMap,查询两个key之间的所有键值对,并生成一个Map
NavigableMap
接口,继承SortedMap接口。正如navigable含义一样,接口定义的方法可以看作是起到了导航的作用。同时,数据操作的维度指向Map里的Entry对象,有多个方法是基于Entry进行操作。
- ceilingEntry,ceilingKey,返回一个最小的但是大于等于参数key的key或其所属的的entry对象,找不到时返回null
- firstEntry,lastEntry,返回map排序后的第一个或最后一个Entry对象
- floorEntry,floorKey,返回比参数key小的但是排序最大的key 或其所属Entry
- higherEntry,higherKey,返回比参数key大的但是排序里最小的key 或其所属Entry
- lowerEntry,lowerKey,返回比参数key小的但是排序里最大的key或其所属的Entry
- pollFirstEntry,pollLastEntry,返回并移除排序后的map里第一个或最后一个entry对象
- descendingMap,descendingKeySet,返回一个逆序排列的Map或者key集合
TreeMap
继承AbstractMap,实现NavigableMap接口。TreeMap的底层实现是一个由Entry对象作为根节点构成的一颗红黑树。
构建方法创建对象:
- 无参时,设置比较器为null,但是要求key的类型必须实现Comparable接口,此时TreeMap的默认比较器就是key类型的实现的接口所实现的比较方法。
- 有参,接收一个指定的比较器方法,此时TreeMap的默认比较器就是此比较器了
public TreeMap() {
comparator = null;
}
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
put方法存储数据:
- 如果此时根节点还是null,那么本次创建的Entry对象就是根节点,无parent指向
- 如果当前根节点非null,则从根节点开始与本次新添加的key进行比较
- 若key小于当前节点的key,则根节点切换到它的左节点;
- 若key大于当前节点的key,则根节点切换到它的右节点;
- 若相等,那么新的value覆盖旧value,添加结束。
- 直到最后切换到叶子节点处,创建新的Entry对象, 并设置parent指向,同时parent设置它的左节点或右节点是此entry。
- 对红黑树进行平衡操作
- 存储的数据个数加1,方法结束。
备注:根据方法的返回结果,为null本次就是新增数据,不为null本次就是覆盖数据。
get方法获取数据:
遍历并比较树的节点,找到比较结果key相等的entry,返回entry的value。