如何避免在List中插入重复的对象?

时间:2013-05-26 04:19:34

标签: java list collections equals hashcode

我有两个员工对象

Employee e1 = new Employee("1");  
Employee e2 = new Employee("1");

那么如何避免在跟随List

中插入第二个对象
List<Employee> list = new ArrayList<Employee>();  

我们可以使用hashcode()equals()方法来避免在列表中插入重复的对象吗?怎么样?

3 个答案:

答案 0 :(得分:2)

列表有一种方法来检查对象是否在其中。它在内部使用equals()方法。

if(!list.contains(e2))
{
    list.add(e2);
}

答案 1 :(得分:2)

您可以使用Set来避免插入重复项。但为此,您需要覆盖Employee类的hashCode()equals()方法,以定义究竟是e1.equals(e2)的内容。

答案 2 :(得分:0)

在你的问题中,e1和e2在哈希码方面并不完全相同。因此,您无法使用.equals()==.hashCode().equals()将其等同起来。您必须实现自己的方法,以根据这些对象中包含的数据检查是否相等。对于Java,使用new实例化的每个对象都是不同的对象。

以下摘自Java Api doc for hashcode method

  

hashCode的一般合约是:

     
      
  1. 每当在同一个对象上多次调用它时   执行Java应用程序时,hashCode方法必须   如果没有使用任何信息,则始终返回相同的整数   in equals比较对象被修改。这个整数需要   从一次执行申请到保持不一致   另一个执行相同的应用程序。
  2.   
  3. 如果两个物体相等   根据equals(Object)方法,然后调用hashCode   对两个对象中的每一个的方法必须产生相同的整数   结果。
  4.   
  5. 如果两个对象不相等,则不需要   到equals(java.lang.Object)方法,然后调用hashCode   对两个对象中的每一个的方法必须产生不同的整数   结果。但是,程序员应该意识到生产   不等对象的不同整数结果可以改善   哈希表的表现。
  6.         

    尽可能合理实用,由hashCode方法定义   class Object确实为不同的对象返回不同的整数。 (这个   通常通过转换内部地址来实现   将对象转换为整数,但这种实现技术不是   JavaTM编程语言所要求的。)