C# 具有提供值相等的内置值类型,而 Java 没有。因此,用 Java 编写自己的哈希码可能是必要的,而用 C# 编写可能是过早的优化。
编写一个类型以用作在 Dictionary/HashMap 中使用的复合键是很常见的。通常在此类类型上,您需要值相等(equivalence)而不是引用相等(identity),例如:
IDictionary<Person, IList<Movie> > moviesByActor; // e.g. initialised from DB
// elsewhere...
Person p = new Person("Chuck", "Norris");
IList<Movie> chuckNorrisMovies = moviesByActor[p];
在这里,如果我需要创建一个新的 Person 实例来进行查找,我需要Person
实现值相等,否则它将与 Dictionary 中的现有条目不匹配,因为它们具有不同的身份。
要获得价值平等,您需要在两种语言中都覆盖Equals()
and 。GetHashCode()
C# 的结构(值类型)为您实现值相等(尽管可能效率低下),并提供一致的GetHashCode
. 这可能足以满足许多人的需求,除非性能问题另有说明,否则他们不会进一步实施自己的改进版本。
Java 没有这样的内置语言特性。如果要创建具有值相等语义的类型以用作复合键,则必须自己实现 equals() 和相应的 hashCode()。(有第三方帮助程序和库可以帮助您执行此操作,但语言本身没有内置任何内容)。
我将 C# 值类型描述为在 Dictionary 中使用时“可能效率低下”,因为: