修改一个类,使其可以用作HashMap中的键

时间:2013-07-09 17:30:44

标签: java

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中的键

5 个答案:

答案 0 :(得分:4)

对于要用作hashmap中的键的类,基本上需要完成三件事。首先使类不可变,第二个覆盖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

答案 1 :(得分:0)

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

Map<Employee, Whatever> theMap = new HashMap<Employee, Whatever>();

答案 2 :(得分:0)

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

让类不可变也是一个好主意,就好像hashCode在程序中间更改你的密钥现在是无用的。

答案 3 :(得分:0)

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

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

如果您使用Eclipse作为IDE,它可以为您生成这两种功能 只需在源代码中的任何位置执行Richt-Click - &gt; 来源 - &gt; 生成Hashcode()和equals()。

答案 4 :(得分: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。