TreeMap介绍
##
前言
Github:https://github.com/HealerJean
使用场景:
那如果我们在一个对查找性能要求不那么高,反而对有序性要求比较高的应用场景
这个时候HashMap就不再适用了,我们需要一种新的Map,TreeMap.
HahMap是Key无序的,而TreeMap是Key有序的。
1、观察下大概的源码
1、TreeMap继承了NavigableMap,而NavigableMap继承自SortedMap,为SortedMap添加了搜索选项 2、NavigableMap有几种方法,分别是不同的比较要求:floorKey是小于等于,ceilingKey是大于等于,lowerKey是小于,higherKey是大于。 3、注意初始化的时候,有一个Comparator成员,这是用于维持有序的比较器,当我们想做一个自定义数据结构的TreeMap时,可以重写这个比较器
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
{
private final Comparator<? super K> comparator;
private transient Entry<K,V> root = null;
private transient int size = 0;
private transient int modCount = 0;
public TreeMap() {
comparator = null;
}
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
//后面省略
}
2、在和优酷接口进行对接的时候用到
https://doc.open.youku.com/?docid=317#anchort4
将所有请求参数按照字母先后顺序排序,自动根据key的字母顺序排序,非常牛
TreeMap treeMap = new TreeMap();
treeMap.put("idfa",idfa);
treeMap.put("appid",appid);
treeMap.put("action",action);
treeMap.put("client_id",client_id);
treeMap.put("timestamp",timestamp);
treeMap.put("version",version);
treeMap.put("ip",ip);
treeMap.put("company_name",company_name);
3、顺序和逆序
3.1、逆序排列 (普通的Map)
重点如下
Map<Long, Long> tMapRever = new TreeMap<>(Collections.reverseOrder());
tMapRever.putAll(getStartIdAndEndId(31L,3L));
public static Map<Long,Long> getStartIdAndEndId(Long count, Long fenduan){
Map<Long,Long> map = new HashMap<>();
Long num = count / fenduan;
Long yushu = count % fenduan;
for (int i = 1; i <= num; i++) {
map.put((i - 1) * fenduan + 1, i * fenduan);
}
Long yushufinal = num * fenduan + yushu;
map.put(num * fenduan + 1, yushufinal);
return map ;
}
public static void main(String[] args) {
Map<Long, Long> tMapRever = new TreeMap<>(Collections.reverseOrder());
tMapRever.putAll(getStartIdAndEndId(31L,3L));
for(Long key :tMapRever.keySet() ){
System.out.println("key:"+key+":"+tMapRever.get(key));
}
}