相等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;
}
# 1 楼答案
您需要重写^ {< CD1>}强>和^ {< CD2>}/Stime>方法,以告诉哈什集中您认为相等的值。
如果您使用的是树集,那么应该实现
Comparable
# 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 楼答案
您肯定应该重写
equals
和hashCode
,因为它们是Java用来定义对象相等性的方法。默认情况下,所有Objects
都是不同的。有关实现的详细信息,请参阅Joshua Bloch的《有效Java》一书
# 4 楼答案
关于:
默认的
equals
实现执行最严格的(文档称最具辨别力的)平等测试,即测试身份(即两个引用引用引用内存中的同一位置)这是平等的一种形式,但并不总是最有用的。通常,您要测试的是两个对象具有相同的属性。这是一件非常自然的事情,不值得任何焦虑