以字符串"123"为例:字符'1'的ascii码是49,hashCode = (49*31 + 50)*31 + 51或者这样看:hashCode=('1' * 31 + '2' ) * 31 + '3'。可以看作是一种权重的算法,在前面的字符的权重大。这样有个明显的好处,就是前缀相同的字符串的hash值都落在邻近的区间。好处有两点:
1.可以节省内存,因为hash值在相邻,这样hash的数组可以比较小。比如当用HashMap,以String为key时。
2.hash值相邻,如果存放在容器,比好HashSet,HashMap中时,实际存放的内存的位置也相邻,则存取的效率也高。
以31为倍数,原因是31的二进制全是1,在一定程度上可以有效地离散数据。