0
class Employee

{

    private String name;
    private int age;
    private int empid;

    public Employee(String name, int age, int empid) 
    {
        super();
        this.name = name;
        this.age = age;
        this.empid = empid;
    }
}

如何修改上面的类,使其可以用作 HashMap 中的键

4

5 回答 5

4

对于要用作哈希映射中的键的类,基本上需要做三件事。首先使类不可变,第二覆盖 hashCode 方法,第三覆盖 equals 方法。

使类不可变。以下是一些不变性的规则:

  • 使课程最终
  • 使所有成员成为最终成员,在静态块中或在构造函数中显式设置它们
  • 将所有成员设为私有
  • 没有修改状态的方法

从本教程中了解有关创建不可变类的更多信息:

http://javarevisited.blogspot.in/2013/03/how-to-create-immutable-class-object-java-example-tutorial.html

要了解如何覆盖 hashCode 和 equals 方法,请遵循以下步骤:

http://javarevisited.blogspot.in/2011/02/how-to-write-equals-method-in-java.html

于 2013-07-09T17:31:39.827 回答
0

它已经可以在哈希图中使用。所有Java 对象都有一个hashCodeandequals方法,这是 hashmap 工作所必需的。

Map<Employee, Whatever> theMap = new HashMap<Employee, Whatever>();
于 2013-07-09T17:32:15.357 回答
0

你没有顶部做任何事情。所有类都扩展了 Object 类。并且由于方法hashcode()equals()定义在 Object 类中,任何类都可以用作键。

但是,如果您真的打算将您的类用作 HashMap 键,则应该覆盖这两种方法。

如果您使用 Eclipse 作为您的 IDE,它可以为您生成这两个函数。
只需在源中的任意位置执行 Richt-Click ->->生成 Hashcode() 和 equals()。

于 2013-07-09T17:43:25.340 回答
0

为了将类用作有效的哈希映射键,该类应同时覆盖equalshashCode。该hashCode变量返回一个 int,用于计算此特定对象的低级查找索引。

使类不可变也是一个好主意,因为如果 hashCode 在程序中更改,您的密钥现在就没有用了。

于 2013-07-09T17:42:28.727 回答
0

将自定义类作为您的 HashMap 中的键的充分条件。

   1. Override equals and Hashcode - good practice.
      Read Item 8 and Item 9 from Effective Java (must Read) for 
      the general contract among them.
   2. Try to make your Class Immutable. Atleast 
      those fields should be final/immutable on which your hashcode 
      and equals depend. So that you hashcode/equals in dosen't fail later
      in your program

如果您认为您只想检查引用是否相等(不推荐),请使用 IdentityHashMap。

于 2013-07-09T17:45:41.400 回答