hashcode的作用_jdbc hibernate区别_java hashcode相同(7)

电脑杂谈  发布时间:2017-03-08 18:10:33  来源:网络整理

hashCode = 1;

Iterator i = list.iterator();

while (i.hasNext()) {

Object obj = i.next();

hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());

}

不仅仅散列值取决于list的内容,而且还规定了结合各个Element的散列值的特殊算法。(String类规定类似的算法用于计算String的散列值。)

编写自己的equals()和hashCode()方法

忽略缺省的equals()方法比较简单,但如果不违反对称(Symmetry)或传递性(Transitivity)需求,忽略已经忽略的equals() 方法极其棘手。当忽略equals()时,您应该总是在equals()中包括一些Javadoc注释,以帮助那些希望能够正确扩展您的类的用户。

作为一个简单的例子,考虑以下类:

class A {

final B someNonNullField;

C someOtherField;

int someNonStateField;

}

我们应如何编写该类的equals()的方法?这种方法适用于许多情况:

public boolean equals(Object other) {

// Not strictly necessary, but often a good optimization

if (this == other)

return true;

if (!(other instanceof A))

return false;

A otherA = (A) other;

return

(someNonNullField.equals(otherA.someNonNullField))

%26amp;%26amp; ((someOtherField == null)

? otherA.someOtherField == null

: someOtherField.equals(otherA.someOtherField)));

}

现在我们定义了equals(),我们必须以统一的方法来定义hashCode()。一种统一但并不总是有效的定义hashCode()的方法如下:

public int hashCode() { return 0; }

这种方法将生成大量的条目并显著降低HashMaps的性能,但它符合规范。一个更合理的hashCode()实施应该是这样:

public int hashCode() {

int hash = 1;

hash = hash * 31 + someNonNullField.hashCode();

hash = hash * 31

+ (someOtherField == null ? 0 : someOtherField.hashCode());

return hash;

}

注意:这两种实施都降低了类状态字段的equals()或hashCode()方法一定比例的计算能力。根据您使用的类,您可能希望降低superclass的equals()或hashCode()功能一部分计算能力。对于原始字段来说,在相关的封装类中有helper功能,可以帮助创建散列值,如Float.floatToIntBits。

编写一个完美的equals()方法是不现实的。通常,当扩展一个自身忽略了equals()的instantiable类时,忽略equals()是不切实际的,而且编写将被忽略的equals()方法(如在抽象类中)不同于为具体类编写equals()方法。关于实例以及说明的更详细信息请参阅Effective Java Programming Language Guide, Item 7 (参考资料) 。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-36492-7.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...