集合笔记之TreeMap

集合笔记之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);
 }

数据结构一窥

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值