TreeMap匿名内部类使用Comparator方法(比较器)被替换

java 复制代码
    public static void main(String[] args) {
//        TreeMap treeMap = new TreeMap();
        TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String)o1).length()-((String)o2).length();
            }
        });
        treeMap.put("tom","汤姆");
        treeMap.put("smith","史密斯");
        treeMap.put("jenny","杰尼");
        treeMap.put("amstedam","阿姆斯特丹");
        System.out.println(treeMap);
    }
}

我们使用Comparator比较器重写了父类的方法,进行两个Key值的长度比较,来进行排序时,发现输出时,smith的value值被替换,如下

查看源码发现:我们重构了Comparator方法后,系统会自己进行比对,如下代码:

java 复制代码
int cmp;
        Entry<K,V> parent;
        // split comparator and comparable paths
        Comparator<? super K> cpr = comparator;
        if (cpr != null) {
            do {
                parent = t;
                cmp = cpr.compare(key, t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }

当两个字符串的长度相同时,返回的return 0 ;

此时的Comparator走的是else语句 return t.setValue(value),

继续往下追,进入到setValue方法:

传入的value值为 "杰尼"

返回后

小结:当传入的Key值字符串相等时,只能覆盖上次的Value

相关推荐
丘山一郎2 小时前
Spring 中的IOC控制反转 和DI依赖注入
java·后端·spring
码视野2 小时前
基于 Spring Boot + Vue3 的【大学英语四六级 (CET-4/6) 作文智能评分与句式润色系统】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端·vue3
MetaLite2 小时前
Spring-AOP自调用为什么失效-AopContext真能解决吗
java·后端·spring
大模型码小白2 小时前
AI 对话流性能调优:万级消息的虚拟滚动落地
java·大数据·前端·javascript·人工智能·算法·机器学习
m0_547486662 小时前
《JavaScript核心原理 》全套PPT课件2026
开发语言·javascript·ecmascript
许彰午3 小时前
14-字段级SM4加密与SM2签名
java·低代码·架构
MC皮蛋侠客3 小时前
Tauri 2.x 系列(五):调用系统 API——官方插件、Rust crate 与原生能力
开发语言·后端·rust
布莱克6054 小时前
软中断和硬中断的区别
开发语言·操作系统
whcyhhh4 小时前
头歌实践教学平台:数据科学与大数据技术导论(十二)
大数据·开发语言·python·数据清洗
许彰午4 小时前
13-describe元数据输出
java·低代码·架构·状态模式