Java 集合框架(TreeSet 和 TreeMap)

排序set,排序map

TreeSet:当我们使用无参构造器,创建 TreeSet 时,默认调用添加对象的类的Compareto方法进行排序,如果传入的Key对象没有实现Comparable接口,会抛出classCastException。比如:传入的Key为String类型,那么就会调用String类里面的compareTo()方法。只有实现了Comparable接口的类对象才能加入到TreeSet中,否则就会报classCastException异常

public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        treeSet.add("jack");
        treeSet.add("tom");
        treeSet.add("sp");
        treeSet.add("a");
        System.out.println(treeSet);
    }

调用类的Compareto方法

调用有参构造,可以传入Compartor对象,使用匿名内部类对象

TreeSet treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String) o1).compareTo((String)o2);
            }
        });

源码解析:

1.构造器. 把传入的实现了 Comparator 接口的匿名内部类(对象),传给给 TreeMap comparator

public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }

public TreeMap(Comparator<? super K> comparator) {
        this.comparator = comparator;
    }

2.调用put方法,第一次添加, k-v 封装到 Entry 对象,放入 root

    Entry<K,V> t = root;
        if (t == null) {
            compare(key, key); // 这一步的目的就是检查空值,如果有null则报异常

            root = new Entry<>(key, value, null);
            size = 1;
            modCount++;
            return null;
        }

之后添加元素,才会用到Comparator

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//如果遍历过程中,发现准备添加 Key 和当前已有的 Key 相等,就不添加
                    //对于TreeSet来说,value固定为PRESENT,重新设置value没有任何作用,相当于没添加
                    return t.setValue(value);
            } while (t != null);
        }

对于TreeSet而言,遇到cmp == 0 则不会添加,而对于TreeMap而言,遇到cmp == 0 的情况时,会进行value值 的覆盖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Meikesibondwell

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值