我们可以在Java的哈希图中使用对象作为键吗?

2022-09-03 05:04:19

如何将对象用作哈希映射中的键。如果使用对象作为键,是否需要覆盖该对象的等于和哈希编码方法?


答案 1

一个简单的拇指法则是使用不可变对象作为 中的键HashMap

因为:

如果它是可变的,则值或条件可能会更改,您将永远无法从 中检索密钥。hashcode()equals()HashMap

更准确地说,用于计算的类字段应该是不可变的!equals()hashcode()

现在,假设您创建自己的类:

  • 要比较类的两个对象,您必须重写equals()
  • 要在任何基于哈希的数据结构中将其用作键,您必须覆盖(再次,牢记不可变性)hashcode()

请记住,如果两个对象是 ,那么它们也应该相等!equal()hashcode()


答案 2

hashCode() -HashMap提供用于存储的put(key,value)和用于从HashMap检索值的get(key)方法。当 put() 方法用于存储 (Key, Value) 对时,HashMap 实现调用 Key 对象上的哈希码来计算哈希值,该哈希值用于查找将存储 Entry 对象的存储桶。当 get() 方法用于检索值时,再次使用键对象来计算哈希值,然后使用该哈希来查找存储该特定键的存储桶。

equals() - equals() 方法用于比较对象的相等性。在使用HashMap键对象进行比较的情况下,也使用equals()方法,Map知道如何处理散列冲突(散列冲突意味着多个键具有相同的散列值,从而分配给同一个桶。在这种情况下,对象存储在链表中,请参阅图以更清晰。其中 hashCode 方法有助于查找存储该密钥的存储桶,而 equals 方法有助于查找正确的密钥,因为单个存储桶中可能存储了多个键值对。