bac*_*car 10 .net c# java hash
我搜索正确组合成分哈希码的帮助器GetHashCode()似乎带来了一些敌意.我从评论中得到的印象是,一些C#开发人员认为你不应该GetHashCode()经常覆盖- 当然一些评论者似乎认为帮助正确行为的图书馆将毫无用处.这种功能在Java中被认为是有用的,Java 社区要求将它添加到JDK中,现在它已经在JDK 7中了.
是否有一些基本原因在C#中你不需要 - 或者绝对不应 - 像Java一样频繁地覆盖GetHashCode()(并相应地Equals())?我发现自己经常使用Java来做这件事,例如,每当我创建一个我知道要保留的类型HashSet或者用作HashMap(等同于.net Dictionary)中的键时.
C# 具有内置的值类型,可以提供值相等性,而 Java 则没有。因此,用 Java 编写自己的哈希码可能是必要的,而用 C# 编写可能是不成熟的优化。
编写一个类型用作组合键以在 Dictionary/HashMap 中使用是很常见的。通常,在此类类型上,您需要值相等(等价)而不是引用相等(身份),例如:
IDictionary<Person, IList<Movie> > moviesByActor; // e.g. initialised from DB
// elsewhere...
Person p = new Person("Chuck", "Norris");
IList<Movie> chuckNorrisMovies = moviesByActor[p];
Run Code Online (Sandbox Code Playgroud)
在这里,如果我需要创建一个新的 Person 实例来进行查找,我需要Person实现值相等,否则它将与字典中的现有条目不匹配,因为它们具有不同的标识。
为了获得价值相等,您需要在两种语言中重写Equals()and , 。GetHashCode()
C# 的结构(值类型)为您实现值相等(尽管可能效率较低),并提供一致的GetHashCode. 这可能足以满足许多人的需求,除非性能问题另有要求,否则他们不会进一步实现自己的改进版本。
Java 没有这样的内置语言功能。如果要创建具有值相等语义的类型来用作组合键,则必须自己实现 equals() 和相应的 hashCode()。(有第三方帮助程序和库可以帮助您执行此操作,但语言本身没有内置任何内容)。
我将 C# 值类型描述为在字典中使用“可能效率低下”,因为:
ValueType.Equals有时可能会很慢。这用于字典查找。ValueType.GetHashCode虽然正确,但可能会产生许多冲突,从而导致字典性能非常差。看看Jon Skeet 对问题的回答,它表明KeyValuePair<ushort, uint>似乎总是产生相同的 hashCode!| 归档时间: |
|
| 查看次数: |
510 次 |
| 最近记录: |