最近在自学JAVA看的是COREJAVA 然后讲到hashcode的时候有疑问了~书里给了这样一段代码:
public int hashCod()
{
        return 7*name.hashCode()+11*new Double(salary).hashCode+13*hireDay.hashCode();
}只是不明白7、11、13是怎么来的 书上也没有说 所以回家来问问大家 希望大家帮忙谢谢~~O(∩_∩)O

解决方案 »

  1.   

    印象不深了 不知道我的解释可以不 你想想楼主hashcode 最好是唯一的对不
    但是由于上面如果不乘个东西很可能得到不同的东西+起来却是同一个值
    比如你看 2+3+4=9   1+1+7=9 
    如果 7*1+11*3+13*4 还等于 7*1+11*1+13*7吗?
    所以其实前面的数字 不是固定的只是为了让得到的结果 相等的几率变小 尽量保持唯一 当然就算唯一其实也没什么
    后面用equals 在判定下 这是我的理解 印象不深了 希望启发下楼主```
      

  2.   

    hashCode相当于数字签名样的,前面这些数字是散列吗,通过哈希算法算出来的一大窜数字之类的东西和内存有关。所以每次这些数字都不一样的
      

  3.   

    刚才又想了下 我在1楼的解释应该是对的 你想想 你那个肯定是重写了hashcode的方法
    为的是 在比较对象是不是同一个 那个代码应该是这个意思,一般是先比较hashcode 在比较重写的equals方法
    先比较hashcode 这样效率高些 所以自己的代码应该尽量使得每个对象的hashcode 保持唯一 所以才在每个成员变量前
    加了数字 其实这个数字是可以自己改变的 但是目的是为了让 最后的hashcode 在不同的对象上表示不同的值
    加了数字就会提高唯一的几率 当然加个 13 啊 7啊 或者29啊 非常好 千万别加 1 2 10 这样的数 !
    印象中 你看的那本书后 应该有解释这个数字的原因 我也记不清楚了 楼主再仔细看看书后面是否有讲解!
      

  4.   

    更正下楼上的,散列表比较对象时hashcode是用来获取对象的,不会用来比较的,只有equals才是用来比较的
    像13,7,31这样的数只是用来降低产生同义词的几率,尽量保证hashcode的唯一性
      

  5.   

    不会用来比较的? 别一棒子打死 你这话绝对不对
    我是记不清是哪个方法了 有个方法 在用时 必须 要自己定义好hashcode和equals 原因就是提高比较的效率
    先用 hashcode 来比较,当然我的比较是说 是不是同一个元素 也许你认为比较就是 比较大小
    ok?