TreepMap添加重复键时,基本数据类型的包装类和引用数据类型的区别

TreeMap中添加基本数据类型的包装类和引用数据类型的区别

1、基本数据类型

当调用TreeMap的put方法时,如果存在相同的键(key),新的值(value)将会覆盖旧的值。TreeMap是基于红黑树实现的,它要求键是可比较的(实现Comparable接口或通过传递Comparator对象)。如果两个键相同,根据红黑树的性质,它们会被视为相等的键,新的值将替代旧的值。

示例代码:

import java.util.TreeMap;

public class TreeMapExample {
    public static void main(String[] args) {
        TreeMap<Integer, String> treeMap = new TreeMap<>();

        // 添加键值对
        treeMap.put(1, "One");
        treeMap.put(2, "Two");
        treeMap.put(3, "Three");

        System.out.println("Original TreeMap: " + treeMap);

        // 重复的键,新值将替代旧值
        treeMap.put(2, "New Two");
        System.out.println("TreeMap after updating key 2: " + treeMap);
    }
}

在上述例子中,当我们将键2的值从"Two"更新为"New Two"时,新的值覆盖了旧的值。输出结果如下:

Original TreeMap: {1=One, 2=Two, 3=Three}
TreeMap after updating key 2: {1=One, 2=New Two, 3=Three}

2、引用数据类型

示例代码:

Student student1 = new Student(1, "zhangsan1");
Student student2 = new Student(1, "zhangsan2");
Student student3 = new Student(2, "lisi");
TreeMap<Student, String> map = new TreeMap<>((o1, o2) -> o1.id- o2.id);
map.put(student1,"first");
map.put(student2,"second");
map.put(student3,"third");
for (Student s:map.keySet()) {
    System.out.println("name:"+s.name);
}

结果:

name:zhangsan1
name:lisi

在TreeMap中,键值的比较是通过比较键对象的compareTo方法或通过传递的Comparator来实现的。在你的例子中,你通过传递了一个比较器 (o1, o2) -> o1.id - o2.id 来比较 Student 对象的 id 字段。

因为 student1 和 student2 的 id 相同,它们在比较时会被认为是相等的。在 TreeMap 中,如果两个键被认为是相等的,新添加的键值对不会替代旧的键值对,所以在遍历时只会看到最先放入的那个。

原因总结:

对于引用数据类型,比如你自定义的 Student 类,compareTo 方法是你自己实现的,它决定了在比较两个对象时返回的结果。如果你认为两个对象相等,那么在 TreeMap 中它们就会被视为相等,新添加的键值对不会替代旧的键值对。

而对于基本数据类型的包装类,比如 Integer,compareTo 方法是由 Java 标准库提供的,它是直接比较数值大小的。如果两个 Integer 对象的值相等,它们在比较时就会被认为是相等的,因此新添加的键值对会替代旧的键值对。

总结来说,区别在于 compareTo 方法的实现,自定义类的比较逻辑是由你自己定义的,而基本数据类型的包装类使用的是标准库提供的默认比较逻辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值