代码之家  ›  专栏  ›  技术社区  ›  Hosam Aly

为非常简单的类实现`hashCode()`

  •  9
  • Hosam Aly  · 技术社区  · 17 年前

    我有一个非常简单的类,只有一个字段成员(例如String)。可以实施吗 hashCode() fieldMember.hashCode() ?或者我应该以某种方式操纵字段的哈希码吗?此外,如果我应该操纵它,为什么呢?

    9 回复  |  直到 17 年前
        1
  •  12
  •   bobwienholt    17 年前

    如果fieldMember是唯一标识对象的一种很好的方法,我会说是的。

        2
  •  10
  •   duffymo    17 年前

    Joshua Bloch阐述了如何在“Effective Java”中正确重写equals和hashCode Chapter 3 .

        3
  •  4
  •   Michael Myers KitsuneYMG    17 年前

    这种技术对于组合多个哈希码非常有用,并且仍然保持相对较小的冲突风险;它对单个哈希码没有任何影响。

        4
  •  2
  •   Paul Tomblin    17 年前

    是的,这很标准。如果类反映了数据库行,我只返回主键。

        5
  •  1
  •   Paul Brinkley    17 年前

    只有两个真正的要求 hashCode :一,那个 equals

    如果你的字段的哈希码算法符合上述要求,那么它的算法也适用于你的类,如果你的类 同等的人 同等的人 .

        6
  •  1
  •   gedevan    17 年前
        7
  •  0
  •   Techmaddy    17 年前

    是啊。这是很好的编程实践。我通常使用:

        8
  •  0
  •   Peter Lawrey    17 年前

    通常,除非您将此对象用作*HashMap或*HashSet中元素的键,否则不需要重写hashCode()。

        9
  •  0
  •   Jeff Olson    17 年前

    正如其他人提到的,你应该遵循Effective Java中的建议。如果你重写了hashCode()方法,你也应该重写equals()方法。此外,这两种方法应该是一致的。

    为了简化编写好的equals()和hashCode()方法,我使用 EqualsBuilder HashCodeBuilder 来自Apache Commons Lang

    以下是示例:

    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        User other = (User) o;
        return new EqualsBuilder()
                .append(this.getUniqueId(), other.getUniqueId())
                .isEquals();
    }
    
    public int hashCode() {
        return new HashCodeBuilder()
                .append(this.getUniqueId())
                .toHashCode();
    }