0

我有一个Set<SelectDTO>带有单个元素的元素,但在使用 .contains 和一个新的 SelectDTO 时失败了,如下所示:

Set<SelectDTO> setDTOs = new HashSet<SelectDTO>
//processing where an element with <name = "ME101", id = 102> is added.

SelectDTO selectDTO = new SelectDTO();
selectDTO.setName("ME101");
selectDTO.setId(102);
if (!setDTOs.contains(selectDTO)){
     throw new Exception();
}

我已经覆盖了 SelectDTO's .hashCode(),因此它被计算为参数 id 和 name 的总和。我已经调试并确认执行经历了.hashCode()两次:第一次是元素添加到集合时,第二次是调用.contains(). 两个元素的 hashCode 都是 -2024486876。而且,在调试时,我看到集合中的表只有一个元素,它的“哈希”是-1909995738。

这是我的 hashCode 的代码,尽管我认为问题不存在:

@Override
public int hashCode() {
    int result = 0;
    result += this.getName() != null ? this.getName().hashCode() : 0;
    result += this.getId() != null ? this.getId() : 0;
    return result;
}

我想这.contains()是使用这个“哈希”值来比较,但我不知道为什么。

4

2 回答 2

4

Set.contains() 文档

返回true此集合是否包含指定元素。更正式地说,true当且仅当此集合包含e这样的元素时才返回(o==null ? e==null : o.equals(e))

换句话说,你不仅需要实现hashCode(),还需要equals().

于 2013-07-09T09:16:15.867 回答
0

您似乎忘记在 Set 中添加 selectDTO 元素:

setDTOs.add(selectDTO);

假设您已经在代码中的某处添加了元素,那么您需要覆盖 equals 方法而不是 hashCode。As contains()方法使用equals()方法来确定集合中是否存在元素。有趣的是,我相信这就是 Set 确保它不会在 Set 中推送重复元素的方式。

于 2013-07-09T09:13:39.760 回答