在.NET GetHashCode方法中,很多地方都使用.NET 方法.特别是在快速查找集合中的项目或确定相等性时.是否有关于如何GetHashCode为我的自定义类实现覆盖的标准算法/最佳实践,因此我不会降低性能?
鉴于以下课程
public class Foo
{
public int FooId { get; set; }
public string FooName { get; set; }
public override bool Equals(object obj)
{
Foo fooItem = obj as Foo;
if (fooItem == null)
{
return false;
}
return fooItem.FooId == this.FooId;
}
public override int GetHashCode()
{
// Which is preferred?
return base.GetHashCode();
//return this.FooId.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
我已经覆盖了该Equals方法,因为它Foo代表了Foos表的一行.哪个是覆盖的首选方法GetHashCode?
覆盖为什么重要GetHashCode?
什么问题/陷阱,必须重写时,必须考虑equals和hashCode?
严格的相等运算符将告诉您两个对象类型是否相等.但是,有没有办法判断两个对象是否相等,就像 Java中的哈希码值一样?
Stack Overflow问题JavaScript中是否有任何类型的hashCode函数?类似于这个问题,但需要更多的学术答案.上面的场景说明了为什么需要有一个,我想知道是否有任何等效的解决方案.
我们如何决定hashCode()集合方法的最佳实现(假设equals方法已被正确覆盖)?
当Java中的类不覆盖hashCode()时,打印此类的实例会给出一个很好的唯一编号.
对象的Javadoc说关于hashCode():
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数.
但是当类重写hashCode()时,我怎样才能获得它的唯一编号?
根据我的理解,我认为:
我对么?
现在,如果我是正确的,我有以下问题:HashMap内部使用对象的哈希码.因此,如果两个对象可以具有相同的哈希码,那么它如何HashMap使用它所使用的键?
有人可以解释HashMap内部如何使用对象的哈希码吗?
我只是想知道为什么在类的hashCode()方法中使用素数?例如,当使用Eclipse生成我的hashCode()方法时,总会使用素数31:
public int hashCode() {
final int prime = 31;
//...
}
Run Code Online (Sandbox Code Playgroud)
参考文献:
这是关于Hashcode的一篇很好的入门文章和关于我如何找到哈希工作的文章(C#但概念是可转移的): Eric Lippert的GetHashCode指南和规则()
hashcode ×10
java ×7
equals ×4
hash ×2
overriding ×2
.net ×1
algorithm ×1
c# ×1
gethashcode ×1
hashmap ×1
identity ×1
javascript ×1
md5 ×1
object ×1
primes ×1