彻底hashCode与hashCode()方法

写这篇文章,主要为分析String类的hashCode()方法做铺垫。

什么时候要用hashCode值?

HashMap,HashSet,HashTable。以HashMap为例,HashMap需要根据key的hashCode和(数组长度-1)进行与操作,来确定Entry在数组中的位置。

hashCode()方法的约定是什么?

在这篇:HashSet理解(二)怎么做到存储的值不重复文章中,我翻译了hashCode()方法的注释,写的很清楚了。贴一下简述:

  • 同一个对象多次调用hashCode方法,equals中比较的属性没变的前提下,hashCode应该返回相同的值。
  • 如果两个对象的equals比较为true,那么这两个对象的hashCode值必须相等。
  • 如果两个对象的equals比较为false, 两个对象的hashCode值不一定要不同,但最好不同,有利于提升哈希表的性能。

hashCode值需要满足什么需求?

结合上面的问题。可以得出结论:尽量保证不同对象拥有不同的hashCode。

equals()方法和hashCode()的区别是什么?

equals()方法返回true和false,用于判断两个对象是否相同。
hashCode()方法会返回hash整数值,主要用于获取对象在哈希表(数组)中的位置。

大写字母A的hashCode是多少?

根据ASCII表,大写字母A的ASCII值是65,按照上面的算法,h=31*0+65=65。代码测下是不是:

public class CharTest {
    
    
    public static void main(String[] args) {
    
    

        String s = new String("A");
        System.out.println(s.hashCode());
    }
}

输出:

65

直接把字符ASCII值相加得到hashCode,行不行?

不行。
如果这样的话,"AC"和"BB"的hashCode值相同,"AC"和"CA"的hashCode值也相同。

猜你喜欢

转载自blog.csdn.net/zhangjin1120/article/details/131600136