先讲个故事
张三家里有20个羊圈,从0-19编号,1000只羊,每只羊都有一个独特的编号,它们各自生活在自己挑选的羊圈里,生活惬意。有一天,有客人感觉114号羊听起来就身姿妙曼,想找114号羊聊聊烤全羊的制作要领,让张三去找出来。张三从0号羊圈一路找到19号,挨个的看羊的编号找到太阳落下,月亮升起,终于在19号羊圈里找到了114号羊,张三累的精疲力竭。
后续肯定还会再来新的客人,每次找羊都这么费精力张三可受不了,于是张三想了个办法,将每只羊按照它的编号对20取模的结果来给羊分配羊圈,这样,要找羊的时候,就可以按照编号来锁定羊圈,每次只用找一个羊圈就可以了,现在张三可以愉快的找某只羊聊天了。
1、什么是hashcode
上文中我们提到,张三家的每只羊都有一个独特的编号,那在Java中,我们如何给定一个对象一个独特的编号呢?每个对象独一无二的,我们很轻易的就想到了对象的地址,我们将物理地址转换为一个整数,然后通过hash函数(在上文中即对20取模,可以是更复杂的函数,不唯一)的运算,就得到了我们的hashcode(所分配羊圈的羊圈编号)。
现在我们可以知道,一个对象的hashcode就是我们通过这个对象的独一无二的标识(一般为物理地址)转化为整数,然后通过hash函数运算得到的值。
2、hashcode的作用
那hashcode有什么作用呢?从故事中我们知道,通过这样一个运算,张三找到某只羊的难度大大降低了,这就体现了hashcode的快捷查找的作用。对应到计算机中,我们通过一个对象的hashcode,就可以在hash表(在上文中即对羊圈的0-19编号总体组成的表)中找到对应的位置,然后存入对象或者找到对象了。
可能有人还是觉得1000只羊分配到20个羊圈,每个羊圈中还是有不少羊,找起来也没有很方便。那如果我们建立足够多的羊圈呢?如果我们建1000个羊圈,在每个羊圈中的找寻,是不是就十分轻松了。增加羊圈的成本很高,但计算机中我们增加hash表位置的成本就相对小很多了。只要我们根据对象数量来建立相应规模大小的hash表,查找就会变得十分方便了。
水平有限,内容存在问题欢迎随时指正,感激不尽。