使用对象的实例作为HashMap键

时间:2017-03-11 14:24:16

标签: java hashmap equals hashcode

我发现了类似的问题,但到目前为止,他们都没有真正帮助我(这可能意味着我做错了,这就是为什么我在这里)。

我有一个HashMap Map<Integer, List<Book>>应该有一个Student的{​​{1}}作为密钥,并且他拥有的ID列表作为值。虽然只传递Book作为关键字,但我觉得这不是一个面向对象的方法,我应该使用ID作为关键字(所以它看起来像这样:{ {1}})。我尝试使用它,但当我尝试返回给定的Student Map<Student, List<Book>>列表时,我遇到了一堆错误,很可能是因为找不到Student。我的教授建议我使用Book Java的Student@Override方法,这是有道理的,因为这是hashCode比较键的方式,但我没有成功(I我不确定我需要比较什么才能看出两个equals是否相同;据说,他们HashMap本身应该有效。以下是重写方法:

Student

我做错了什么?任何你可以放在这上面的光都会非常有帮助。提前谢谢!

1 个答案:

答案 0 :(得分:1)

错误似乎出现在equals方法中,前提是您的id的值超出整数缓存范围,即-128 - 127

 if (id != other.id) // <-- Error
        return false;

从您的示例中,似乎id是Integer对象

  

==检查引用是否相等,即它们是否指向同一个对象。

     

对于基本类型,==检查值是否相等。

     

java.lang.Integer是一个引用类型。 int是基本类型。

     

虽然在Integer的情况下,==仅适用于介于-128之间的数字   和JVM缓存那些值

您需要将其更改为

if (!id.equals(other.id))
            return false;