有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

相等Java对象的“相同性”是如何定义的?

我想向集合中添加自定义类型的对象。我有几个是相同的,也就是说,它们的公共变量有相同的值

我不希望一个“同一”对象的多个实例被添加到集合中,但每次创建一个新对象时,它总是被添加

这是因为类对象的equals方法在对象上实现了最有区别的可能等价关系:“对于任何非空引用值x和y,当且仅当x和y引用同一对象时(x==y的值为true),此方法返回true。”

我是否可以重写此对象的equals方法以进行不同的定义

谢谢大家问题解决了

java对象的相同性是通过重写java对象的equals()方法定义的

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((uri == null) ? 0 : uri.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (!(obj instanceof Resource))
        return false;
    Resource other = (Resource) obj;
    if (uri == null) {
        if (other.uri != null)
            return false;
    } else if (!uri.equals(other.uri))
        return false;
    return true;
}

共 (4) 个答案

  1. # 1 楼答案

    您需要重写^ {< CD1>}强>和^ {< CD2>}/Stime>方法,以告诉哈什集中您认为相等的值。

    如果您使用的是树集,那么应该实现Comparable

  2. # 2 楼答案

    您完全可以重写equals()来比较类中的重要字段。然而,有一些重要的事情需要记住。从http://www.javapractices.com/topic/TopicAction.do?Id=17

    -如果重写equals,则必须重写hashCode

    -哈希代码必须为相等的对象生成相等的值

    -equals和hashCode必须依赖于同一组“有效”字段。在这两种方法中必须使用相同的字段集。您不需要使用所有字段。例如,equals和hashCode中很可能会忽略依赖于其他字段的计算字段

    这基本上是因为集合数据结构是作为散列集实现的;它需要hashCode()将对象放置在基础数组中并在以后找到它,还需要equals()来解决散列冲突(即,多个散列到相同值的对象)

    下面是一个关于实现hashCode()的很好的指南:http://www.javamex.com/tutorials/collections/hash_function_guidelines.shtml

    [编辑]

    我想附和kostja的建议,阅读Josh Bloch关于这个主题的章节。那是一本了不起的书

  3. # 3 楼答案

    您肯定应该重写equalshashCode,因为它们是Java用来定义对象相等性的方法。默认情况下,所有Objects都是不同的。

    有关实现的详细信息,请参阅Joshua Bloch的《有效Java》一书

  4. # 4 楼答案

    关于:

    I get the feeling that my problem is that the two are not equal, since they are different objects which happen to have the same values.

    默认的equals实现执行最严格的(文档称最具辨别力的)平等测试,即测试身份(即两个引用引用引用内存中的同一位置)

    这是平等的一种形式,但并不总是最有用的。通常,您要测试的是两个对象具有相同的属性。这是一件非常自然的事情,不值得任何焦虑