我有两个员工对象
Employee e1 = new Employee("1");
Employee e2 = new Employee("1");
那么如何避免在下面插入第二个对象List
List<Employee> list = new ArrayList<Employee>();
我们可以使用hashcode()
andequals()
方法来避免在列表中插入重复的对象吗?如何?
我有两个员工对象
Employee e1 = new Employee("1");
Employee e2 = new Employee("1");
那么如何避免在下面插入第二个对象List
List<Employee> list = new ArrayList<Employee>();
我们可以使用hashcode()
andequals()
方法来避免在列表中插入重复的对象吗?如何?
列表具有检查对象是否在其中的方法。它在内部使用该equals()
方法。
if(!list.contains(e2))
{
list.add(e2);
}
您可以使用Set来避免插入重复项。但是为此,您需要覆盖类的hashCode()和equals()方法Employee
来定义究竟是什么e1.equals(e2)
。
在您的问题中, e1 和 e2 在哈希码方面并不真正相等。所以你不能用.equals()
or ==
or来真正等同起来.hashCode().equals()
。您必须实现自己的方法来根据这些对象中包含的数据检查是否相等。对于 Java,使用 new 实例化的每个对象都是不同的对象。
以下是 hashcode 方法的 Java Api 文档摘录
hashCode 的一般合约是:
- 每当在 Java 应用程序执行期间对同一个对象多次调用它时,hashCode 方法必须始终返回相同的整数,前提是没有修改对象上的 equals 比较中使用的信息。该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。
- 如果两个对象根据 equals(Object) 方法相等,则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果。
- 如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
尽可能合理地实用,由 Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但 JavaTM 编程语言不需要这种实现技术。)