HashMap方法无法理解它们的调用方式

时间:2016-05-20 13:29:11

标签: java hashmap

我真的不明白下面的代码如何调用get()方法,set()方法和toString()。有人可以解释一下吗?

这里的重点是在看到输出后我不明白如何调用tostring方法。我没有看到任何明确被调用的东西。

public class MyDuplicateKeyEx {

    public static void main(String a[]){

        HashMap<Price, String> hm = new HashMap<Price, String>();
        hm.put(new Price("Banana", 20), "Banana");
        hm.put(new Price("Orange", 30), "Orange");
        printMap(hm);
        Price key = new Price("Banana", 20);
        System.out.println("Adding duplicate key...");
        hm.put(key, "Grape");
        System.out.println("After adding dulicate key:");
        printMap(hm);
    }

    public static void printMap(HashMap<Price, String> map){

        Set<Price> keys = map.keySet();
        for(Price p:keys){
            System.out.println(p+"==>"+map.get(p));
        }
    }
}

class Price{

    private String item;
    private int price;

    public Price(String itm, int pr){
        this.item = itm;
        this.price = pr;
    }

    public int hashCode(){
        int hashcode = 0;
        hashcode = price*20;
        hashcode += item.hashCode();
        return hashcode;
    }

    public boolean equals(Object obj){
        if (obj instanceof Price) {
            Price pp = (Price) obj;
            return (pp.item.equals(this.item) && pp.price == this.price);
        } else {
            return false;
        }
    }

    public String getItem() {
        return item;
    }
    public void setItem(String item) {
        this.item = item;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }

    public String toString(){
        return "item: "+item+"  price: "+price;
    }
}

输出:

item: Apple  price: 40==>Apple
item: Orange  price: 30==>Orange
item: Banana  price: 20==>Banana
Adding duplicate key...
After adding dulicate key:
item: Apple  price: 40==>Apple
item: Orange  price: 30==>Orange
item: Banana  price: 20==>Grape

谢谢!

2 个答案:

答案 0 :(得分:2)

你是对的,没有明确的toString来电。但在幕后,这就是Java正在做的事情。看到p+"==>"+map.get(p)时,Java正在执行p.toString()+"==>"+map.get(p).toString()。这就是为什么你可以毫无问题地连接字符串和对象。

此外,迭代Map的键/值的更好方法是:

public static void printMap(HashMap<Price, String> map) {
    for (Map.Entry<Price, String> entry : map.entrySet()) {
        System.out.println(entry.getKey() + "==>" + entry.getValue())
    }
}

当使用带有用户定义对象的HashMap作为键时,您必须非常小心,从不修改用于计算hashCode的字段如果它们出现在地图中。这就是为什么您经常会看到 final 字段应该用来计算它的原因。通过大型程序,可以避免许多不必要的错误。

答案 1 :(得分:0)

当然没有明确的toString! Java会为您隐式执行此操作!你应该感谢他,你知道。

这段代码背后的神奇之处在于:

p+"==>"+map.get(p)

此处pPricemap.get(p)String。因此,上面基本上是为字符串添加价格,然后在结果中添加另一个字符串。

当Java想要将任何对象添加到字符串时,它会调用该对象的toString来将该对象首先转换为String 。否则,如何将价格添加到字符串中,对吗?

提示:

永远不要使用哈希代码可以更改为哈希映射键的对象。我实际上看到过一个非常极端的人,他用{{1}实现了hashCode方法}!这是帖子:Could not understand the output并且问为什么哈希映射可以用相同的哈希码存储东西。

为避免这种混淆,不要使用可变对象作为键。只需删除那些安装人员就可以了。