集合笔记之TreeMap
TreeMap默认构造器添加元素
//使用默认的构造器,创建TreeMap,是无序的(也没有排序)—这一点运行跟韩老师讲得不一样
public class TreeMap_ {
public static void main(String[] args) {
TreeMap treeMap = new TreeMap();
treeMap.put("peak", "匹克");
treeMap.put("lining", "李宁");
treeMap.put("adids", "阿迪达斯");
treeMap.put("nike", "耐克");
System.out.println(treeMap);
}
}
输出结果:{adids=阿迪达斯, lining=李宁, nike=耐克, peak=匹克}
一个错误演示
public class TreeMap_ {
public static void main(String[] args) {
TreeMap treeMap = new TreeMap();
treeMap.put(new Car("劳斯莱斯"), "劳斯莱斯");
treeMap.put(new Car("奥迪"), "奥迪");
System.out.println(treeMap);
}
}
class Car {
private String name;
public Car(String name) {
this.name = name;
}
}
Exception in thread “main” java.lang.ClassCastException: org.example.Car cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1294)
at java.util.TreeMap.put(TreeMap.java:538)
at org.example.TreeMap_.main(TreeMap_.java:22)
因为Car没有实现Compare接口,所以报了以上错误
TreeMap 传入比较器之后
public class TreeMap_ {
public static void main(String[] args) {
TreeMap treeMap = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//下面调用String的compareTo方法进行字符串大小比较
return ((String) o2).compareTo((String) o1);
}
});
treeMap.put("peak", "匹克");
treeMap.put("lining", "李宁");
treeMap.put("adids", "阿迪达斯");
treeMap.put("nike", "耐克");
System.out.println(treeMap);
}
}
输出结构:{peak=匹克, nike=耐克, lining=李宁, adids=阿迪达斯}
解读源码
//1.构造器,把传入的实现了 Comparator接口的匿名内部类(对象),传给给TreeMap的comparator
//2.调用put方法
// 2.1 第一次添加.
Entry<K,V> t = root;
if (t == null) {
compare(key, key); // type (and possibly null) check
root = new Entry<>(key, value, null);
size = 1;
modCount++;
return null;
}
//2.2 以后添加
Comparator<? super K> cpr = comparator;
if (cpr != null) {
do { //遍历所有的key ,给当前key找到适当位置
parent = t;
cmp = cpr.compare(key, t.key);//动态绑定到我们的匿名内部类的compare
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);//如果遍历过程中,发现准备添加Key和当前已有的Key相等,就不添加
} while (t != null);
}