时间:2021-05-19
本文研究的主要是Java中hashCode的正确求值方法的相关内容,具体如下。
散列表有一项优化,可以将对象的散列码(hashCode)缓存起来,如果散列码不匹配,就不会检查对象的等同性而直接认为成不同的对象。如果散列码(hashCode)相等,才会检测对象是否相等(equals)。
如果对象具有相同的散列码(hashCode),他们会被映射到同一个散列桶中。如果散列表中所有对象的散列码(hashCode)都一样,那么该散列表就会退化为链表(linked list),从而大大降低其查询效率。
一个好的散列函数通常倾向于“为不想等的对象产生不相等的散列码”。理想情况下,散列函数应该把集合中不想等的实例均匀地分布到所有可能的散列上,但是想要完全达到这种理想的情形是非常困难的,下面给出一个相对简单有效的散列方法:
1.把某个非零的常数值,比如说17,保存在一个名为result的int类型的变量中。
2.对于对象中的每个关键域f(指equals方法中涉及的每个域),完成以下步骤:
如果一个类是不可变的(所有域都是final修饰,并且所有域都为基本类型或者也是不可变类),并且计算散列码的开销也比较大,那么就应该考虑把散列码缓存在对象内部。
public class HashCodeDemo { static class HashCodeClass { private final boolean bResult; private final byte byteValue; private final char charValue; private final short shortValue; private final int intValue; private final long longValue; private final float floatValue; private final double doubleValue; private final String str; private final int[] arrayValue; //volatile表示每次均在内存中去存取该变量,以保证该变量是最新的 private volatile int hashCode; public HashCodeClass() { bResult = false; byteValue = 1; charValue = 'a'; shortValue = 1; intValue = 1; longValue = 1l; floatValue = 1.0f; doubleValue = 1.0d; str = getClass().getName(); arrayValue = new int[] {1,2,3,4,5}; } @Override public int hashCode() { if(hashCode == 0) { // 设置一个非零的初始值,可以增加零域的冲突性 int result = 17; // 如果省略乘数,那么只是字母顺序不同的所有字符串都会有相同的散列码 final int HASH_CODE = 31; result = HASH_CODE * result + (bResult ? 1 : 0); result = HASH_CODE * result + byteValue; result = HASH_CODE * result + charValue; result = HASH_CODE * result + shortValue; result = HASH_CODE * result + intValue; result = HASH_CODE * result + (int) (longValue ^ (longValue >>> 32)); result = HASH_CODE * result + Float.floatToIntBits(floatValue); long doubleLongValue = Double.doubleToLongBits(doubleValue); result = HASH_CODE * result + (int) (doubleLongValue ^ (doubleLongValue >>> 32)); result = HASH_CODE * result + (str == null ? 0 : str.hashCode()); System.out.println("str=" + str + ", str.hashCode=" + str.hashCode()); result = HASH_CODE * result + arrayValue.hashCode(); return result; } return hashCode; } } public static void main(String[] args) { HashCodeClass obj = new HashCodeClass(); System.out.println("obj.hashCode=" + obj.hashCode()); System.out.println("obj="+obj.toString()); }}输出
str=com.demo.test.HashCodeDemo$HashCodeClass, str.hashCode=-205823051obj.hashCode=946611167str=com.demo.test.HashCodeDemo$HashCodeClass, str.hashCode=-205823051obj=com.demo.test.HashCodeDemo$HashCodeClass@386c23df总结
以上就是本文关于浅谈Java中hashCode的正确求值方法的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
详解Java中hashCode的作用以下是关于HashCode的官方文档定义:hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,
Java覆盖equals时总要覆盖hashcode最近学习java的基础知识,碰到Java覆盖equals时总要覆盖hashcode时候有许多疑问,经过和同事直
首先提出这样一个问题:如果两个对象不相同,他们的hashCode值一定不相等吗?我们都知道equals和hashCode是Object中的方法,java中每一个
Java中==运算符与equals方法的区别及intern方法详解1.==运算符与equals()方法2.hashCode()方法的应用3.intern()方法
java中重写equals和重写hashCode()记得在刚上初一的时候,第一堂数学课学的是集合,那时候我知道了集合是不允许重复元素存在的。hashCode方法