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

相关推荐
reasonsummer19 分钟前
【办公类-115-06】20250920职称资料上传04——docx复制、docx转PDF(课程表11个)
开发语言·windows·python·c#
栀寒老醑1 小时前
Python实现的服务器日志监控脚本
开发语言·python
星星点点洲1 小时前
PostgreSQL 15二进制文件
开发语言·设计模式·golang
小糖学代码1 小时前
Linux:11.线程概念与控制
linux·服务器·c语言·开发语言·c++
yaoxin5211232 小时前
211. Java 异常 - Java 异常机制总结
java·开发语言·python
Empty_7774 小时前
编程之python基础
开发语言·python
疯狂吧小飞牛5 小时前
Lua 中的 __index、__newindex、rawget 与 rawset 介绍
开发语言·junit·lua
Predestination王瀞潞7 小时前
Java EE开发技术(Servlet整合JDBC银行管理系统-上)
java·servlet·java-ee·jdbc
寻星探路7 小时前
Java EE初阶启程记13---JUC(java.util.concurrent) 的常见类
java·开发语言·java-ee
哲Zheᗜe༘7 小时前
了解学习Python编程之python基础
开发语言·python·学习