我不明白这个输出。
因为我另外创建了四个键(瓶子b1,b2,b3,b4)。
4个键还有其他属性。
所以,我认为这段代码可以打印4个输出。
但是此代码仅输出3个输出。
为什么????
package map;
import java.util.Map;
import java.util.TreeMap;
public class TreeMapExample {
public static void main(String[] args) {
Bottle b1 = new Bottle("red", 15);
Bottle b2 = new Bottle("black", 10);
Bottle b3 = new Bottle("white", 20);
Bottle b4 = new Bottle("green", 10);
// Bottle b4 = new Bottle("red", 10);
// Bottle b4 = new Bottle("red", 11);
TreeMap<Bottle, Integer> treeMap = new TreeMap<Bottle, Integer>();
treeMap.put(b1, 10);
treeMap.put(b2, 15);
treeMap.put(b3, 5);
treeMap.put(b4, 20);
for (Map.Entry<Bottle, Integer> entry : treeMap.entrySet()) {
System.out.println(entry.getKey() + " - " + entry.getValue());
}
}
}
class Bottle implements Comparable<Bottle> {
String name;
int size;
Bottle(String name, int size) {
this.name = name;
this.size = size;
}
@Override
public int compareTo(Bottle o) {
return this.size - o.size;
}
@Override
public String toString(){
return name + " bottle";
}
}
如果Bottle b4 = new Bottle("green", 10);
或Bottle b4 = new Bottle("red", 10);
结果是
black bottle - 20
red bottle - 10
white bottle - 5
但是如果Bottle b4 = new Bottle("red", 11);
结果是
black bottle - 15
red bottle - 20
red bottle - 10
white bottle - 5
我不明白这个输出...
答案 0 :(得分:1)
TreeMap
考虑了在自定义比较器中使用的键的相等性。因为您的两个瓶子相等(因为它们的大小值相同),所以替换了一个。在这种情况下:绿色替换为黑色。
看看treeMap.put返回什么:
返回: 与key关联的先前值;如果没有key映射,则为null。 (返回null可能还表明地图先前将null与key关联。)
https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html#put-K-V-
如果我们输出treeMap.put(...)
返回的内容,我们将看到得到四个nulls
,在最后一种情况下,我们得到15
。因此,将b4
替换为b2
是因为它们相等:
System.out.println(treeMap.put(b1, 10));
System.out.println(treeMap.put(b2, 15));
System.out.println(treeMap.put(b3, 5));
System.out.println(treeMap.put(b4, 20));
给予:
null
null
null
15