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 方法的实现,自定义类的比较逻辑是由你自己定义的,而基本数据类型的包装类使用的是标准库提供的默认比较逻辑。