我真的不明白下面的代码是如何调用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
谢谢!!
对的,没有明确调用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
的字段(如果它们存在于映射中)。这就是为什么您经常会看到应该使用最终字段来计算它的原因。对于大型程序,这避免了许多不必要的错误。
当然没有明确的toString
!Java 隐含地为您执行此操作!你应该感谢他,你知道的。
这段代码背后的魔力在于:
p+"==>"+map.get(p)
在这里,p
是Price
,map.get(p)
是String
。所以上面基本上是给一个字符串加一个价格,然后在结果中添加另一个字符串。
当 Java 想要将任何对象添加到字符串中时,它会调用该对象的toString
以首先将该对象转换为String
。否则,如何将价格添加到字符串中,对吗?
提示:
切勿使用哈希代码可以更改的对象作为哈希映射的键。我实际上见过一个非常极端的人,他用Math.random()
实施了hashCode
方法!这是帖子: 无法理解输出 并询问为什么哈希图可以使用相同的哈希码存储内容。
因此,为避免混淆,请不要使用可变对象作为键。只要去掉那些二传手,你就会没事的。