【发布时间】:2014-12-25 11:24:46
【问题描述】:
在覆盖对象 (BookMe) 的 hashcode 方法后,我正在执行下面的代码。目的是覆盖对象的哈希码,我将在我的地图(哈希图)中将其用作键。但是,执行后我看到空值。地图的实际大小没有问题。下面是代码。如果我不覆盖哈希码方法,我会得到正确的输出(我的意思是所有三个值)。 `
class BookMe{
private String isbn ;
static int i = 0;
public BookMe(String isbn)
{
this.isbn = isbn;
}
public String getIsbnValue()
{
return this.isbn;
}
@Override
public boolean equals(Object o)
{
if(o instanceof BookMe && ((BookMe)o).getIsbnValue() == this.getIsbnValue())
{
return true;
}
else{
return false;
}
}
@Override
public int hashCode()
{
return this.isbn.toString().length() + (++i);
}
}
公共类 HashMapTest {
public static void main(String[] args) {
Map<BookMe, Integer> map = new HashMap<BookMe, Integer>();
BookMe b1 = new BookMe("Graham");
BookMe b2 = new BookMe("Graham");
BookMe b3 = new BookMe("Graham");
map.put(b1, 19);
map.put(b2, 33);
map.put(b3, 22);
System.out.println("----444444--------");
System.out.println(map.size());
Set <BookMe> set = map.keySet();
System.out.println("------*****------");
for(BookMe bk : set)
{
System.out.println("bk : "+ bk);
System.out.println(map.get(bk));
}
}
} `
【问题讨论】:
-
您正在修改一个静态字段并使用它来影响返回的哈希码。这意味着同一个对象在重复调用时不会给出相同的哈希码。这作为哈希码完全没用。
-
这可能是您的问题的原因:
(BookMe)o).getIsbnValue() == this.getIsbnValue()。请参阅我链接到的问答以获得解释。 -
@Stephen... 我已经进行了更改。我理解错误,有一个被忽略的代码错误,我已更正为“等于”。这不是我的论点。请参阅 Eran 回复中的第三条评论。
标签: java hashmap equals hashcode