我们可以在Java中使用object作为hashmap中的键吗?

时间:2017-08-23 06:07:39

标签: java hashmap

如何将对象用作hashmap中的键。如果使用对象作为键,是否需要覆盖该对象的equals和hashcode方法?

6 个答案:

答案 0 :(得分:5)

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

因为:

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

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

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

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

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

答案 1 :(得分:4)

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

equals() - equals()方法用于比较对象是否相等。在HashMap的情况下,密钥对象用于比较,也使用equals()方法Map知道如何处理哈希冲突(哈希冲突意味着多个具有相同哈希值的密钥,因此分配给同一个桶。在这种情况下,对象是存储在链表中,请参阅图以获得更清晰的信息。 hashCode方法有助于找到存储该密钥的存储桶,equals方法有助于找到正确的密钥,因为可能存在多个存储在一个存储桶中的键值对。

答案 2 :(得分:2)

您可以使用HashMap中的任何对象,只要它已正确定义hashCodeequals方法 - 这些对象绝对至关重要,因为散列机制依赖于它们。

答案 3 :(得分:0)

package com.java.demo.map;

import java.util.HashMap;

public class TestMutableKey
{
    public static void main(String[] args)
    {
        //Create a HashMap with mutable key
        HashMap<Account, String> map = new HashMap<Account, String>();

        //Create key 1
        Account a1 = new Account(1);
        a1.setHolderName("A_ONE");
        //Create key 2
        Account a2 = new Account(2);
        a2.setHolderName("A_TWO");

        //Put mutable key and value in map
        map.put(a1, a1.getHolderName());
        map.put(a2, a2.getHolderName());

        //Change the keys state so hash map should be calculated again
        a1.setHolderName("Defaulter");
        a2.setHolderName("Bankrupt");

        //Success !! We are able to get back the values
        System.out.println(map.get(a1)); //Prints A_ONE
        System.out.println(map.get(a2)); //Prints A_TWO

        //Try with newly created key with same account number
        Account a3 = new Account(1);
        a3.setHolderName("A_THREE");

        //Success !! We are still able to get back the value for account number 1
        System.out.println(map.get(a3)); //Prints A_ONE
    }
}

答案 4 :(得分:0)

是的,您应该重写equals和hashcode,以确保代码正常运行,否则您将无法获取插入到地图中的键的值。

例如

map.put(new Object(),“ value”);

当您想要获得该值时,

map.get(new Object()); //这将始终返回null

因为有了new Object()-新的哈希码将被生成,并且不会指向保存值的预期存储桶编号,并且如果最终存储桶编号变为相同,它将无法匹配哈希代码甚至等于,所以它总是返回NULL。

答案 5 :(得分:0)

答案是肯定的,自定义类的对象可以用作HashMap中的键。但是,为了从地图中检索到价值对象而不会失败,需要遵循某些准则。

1)Custom class should follow the contract between hashCode() and equals().

合同规定:

If two objects are equal according to the equals(Object) method, then calling
the hashCode method on each of the two objects must produce the same integer result.

这可以通过在自定义类中实现hashcode()和equals()来实现。

2) Make custom class immutable.

提示:使用final,删除二传手,使用深度复制来设置字段