在arraylist中等于和哈希码

时间:2018-09-23 19:31:36

标签: java arraylist equals hashcode

我的问题是为什么即使在自定义对象中实现哈希码和等于之后,为什么ArrayList也不会删除重复项。

例如:我有一个以id和name为属性的雇员对象,同时我也覆盖了哈希码&等于

@Override
public int hashCode() {
    return 1;
}

@Override
public boolean equals(Object obj) {

    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Employee other = (Employee) obj;

    if (this.id != other.id)
        return false;
    return true;
}

3 个答案:

答案 0 :(得分:1)

因为List可以包含重复的元素。如果您不希望这样做,可以改用HashSet

答案 1 :(得分:1)

remove仅删除第一个匹配项(javadoc):

  

从该列表中删除第一次出现的指定元素(如果存在)

如果您首先不想重复,则可以使用Set

答案 2 :(得分:1)

列表并不意味着唯一值。 java.util.List的javadocs中明确记录了这一点:

  

与集合不同,列表通常允许重复的元素。更正式地讲,列表通常允许成对的元素e1和e2,使得e1.equals(e2),并且如果它们完全允许空元素,则它们通常允许多个空元素。并非不可想象,有人希望通过在用户尝试插入运行时异常时抛出运行时异常来实现禁止重复的列表,但我们希望这种用法很少见。

如果需要唯一值的集合,请使用Set(您可能希望使用HashSet