我们假设我们有一个hashcode()
函数,然后在我们的equals()
方法中使用它来确定两个对象的相等性。这是允许/接受的方法吗?
假设我们使用哈希码的简单实现。 (例如,一些实例变量乘以素数。)
答案 0 :(得分:8)
这是检查相等性的一种可怕方法,主要是因为对象不必等于返回相同的哈希码。
您应该始终使用equals方法。
一般规则是:
如果对象a和b的equals方法返回true,则为hashCode 方法必须为a和b返回相同的值。
这并不意味着,如果a和b的hashCode方法返回 相同的值,equals方法必须为这两个返回true 实例
例如:
public int hashCode(){
return 5;
}
是一种有效的,但无效的哈希码实现。
编辑:
在equals方法中使用它将是这样的:
public class Person{
private String name;
public Person(String name){ this.name = name;}
public String getName(){ return this.name;}
@Override
public boolean equals(Object o){
if ( !(o instanceof Person)){ return false;}
Person p = (Person)o;
boolean nameE = this.name == null ? p.getName() == null : this.name.equals(p.getName());
boolean hashE = nameE ? true : randomTrueOrFalse();
// the only moment you're sure hashE is true, is if the previous check returns true.
// in any other case, it doesn't matter whether they are equal or not, since the nameCheck returns false, so in best case, it's redundant
return nameE && hashE;
}
@Override
public int hashCode(){
int hash = generateValidHashCode();
return hash;
}
}
答案 1 :(得分:2)
这是一种非常糟糕的做法。哈希应该具有最小量的碰撞,但通常你有更多可能的对象而不是可能的哈希值,并且由于鸽子原理,一些不同的对象必须具有相同的哈希值。
比较哈希时,你有一定的机会得到误报"。
答案 2 :(得分:1)
实际上,这不是一个坏主意!
但请确保使用此方法来确定不平等,而不是平等。散列代码可能比检查相等性更快,特别是在存储散列码时(例如在java.lang.String
中)。
如果两个对象具有不同的哈希码,则必须不同,否则可能相同。例如,您可以将此方法用作以下
Object a, b;
if(a.hashCode() == b.hashCode()){
if(a.equals(b)) return true;
}
return false;
请注意,在某些情况下,上述代码可能比仅使用equals()
要慢,尤其是在大多数情况下,a
等于b
。
来自Object.java
的文档:
- 如果两个对象根据
equals(Object)
方法相等,则对两个对象中的每一个调用hashCode
方法必须生成相同的整数结果。- 如果两个对象根据
equals(java.lang.Object)
方法不相等则不是必需的,那么在两个对象中的每一个上调用hashCode
方法必须产生不同的整数结果。但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。
答案 3 :(得分:0)
不要这样做
虽然你需要成对地重写equals()和hashCode()是正确的,但是具有相同的散列与具有相同值的散列不同。
付出一些努力,真正想到平等的事情。不要在这里快捷方式以后会咬你。