hash算法(散列算法):根据元素的hashCode值确定元素的存储位置,从而快速定位元素。由于元素的hashCode值一般不会连续,所以元素的存储位置一般也不会连续,即随机存储。
而HashMap的内部实现是通过key的hashCode来确定value的存储位置,key相同,value也应该相同。
首先String是不可变的,并且重写了hashCode(),所以即使两个字符串对象的引用不同,但只要值相同,它们的hashCode就相同,即可以得到相同的value。同时每当创建一个字符串对象的时候,它的hashCode就会被缓存下来,所以在HashMap中存储时避免了重新计算hashCode。
在《Java 编程思想》中有这么一句话:设计 hashCode() 时最重要的因素就是对同一个对象调用 hashCode() 都应该产生相同的值。String 类型的对象对这个条件有着很好的支持,因为 String 对象的 hashCode() 值是根据 String 对象的内容计算的,并不是根据对象的地址计算。
如果使用没有重写hashCode()的对象作为key,只要两个对象的引用不同,它们的hashCode就不同,所以想要检索出相同的value,就必须使用该value存储时使用的key对象。所以非 String 类型的数据类型在判断 key 相同时所需要的条件太过苛刻。
如果你想把自定义的对象作为 key,只需要重写 hashCode() 方法与 equals() 方法即可,但依然无法像使用String作为key时对字符串对象的hashCode进行一个缓存。



