我不明白输出此代码。 (地图)

时间:2019-05-11 05:03:36

标签: java dictionary collections

我不明白这个输出。

因为我另外创建了四个键(瓶子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

我不明白这个输出...

1 个答案:

答案 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