TreeMap是按照Key的排序结果来组织内部结构的Map类集合,它改变了Map类散乱无序的形象。虽然TreeMap没有ConcurrentHashMap和HashMap普及(毕竟插入和删除的效率远没有后者高),但是在Key有排序要求的场景下,使用TreeMap可以事半功倍。
在TreeMap的接口继承树中,有两个与众不同的接口:SortedMap和NavigableMap。
SortedMap接口表示它的Key是有序不可重复的,支持获取头尾Key-Value元素。或者根据Key指定范围获取子集合等。插入的Key必须实现Comparable或提供额外的比较器Comparator,所以Key不允许为null,但是Value可以;
NavigableMap接口继承了SortedMap接口,根据指定的搜索条件返回最匹配的Key-Value元素。不同于HashMap,TreeMap并非一定要覆写hashCode和equals方法来达到去重的目的。
public class TreeMapRepeat {
public static void main(String[] args){
TreeMap treeMap = new TreeMap();
treeMap.put(new Key(),"value one");
treeMap.put(new Key(),"value two");
// TreeMap,size=2因为Key去重规则是根据排序结果
System.out.println(treeMap.size());
}
}
class Key implements Comparable<Key>{
@Override
// 返回负的常数,表示此对象永远小于输入的o对象,此处决定TreeMap的size=2
public int compareTo( Key o) {
return -1;
}
@Override
// hash是相等的
public int hashCode() {
return 1;
}
@Override
// equals比较是相等的
public boolean equals(Object obj) {
return true;
}
}
如果将上述示例中的 TreeMap treeMap = new TreeMap();换成HashMap map = new HashMap();,size的结果则从2变为1.。