本帖最后由 shuwei003 于 2011-12-31 07:13:06 编辑

解决方案 »

  1.   

    按照规定,equals相等的对象,hashcode值也要相等,反过来不一定
      

  2.   

    D不会造成equals相等而hashcode不一样的情况
      

  3.   


    一般我们比较对象,做了两件事:
    A. 两个对象equels返回true,则表示两个对象相同。
    B. 因为hashCode()有个协议,就是类引用相同的两个变量的,
        hashCode访问必须相同。   
    由此推导出两个命题:
     命题A:【equels - > 对象相等】
     命题B:【对象相等 -> 两个对象hashCode()访问相等】;
    一般我们命题A成立就OK了。
    但了让程序完美,所有也让命令B成立。(防止HashMap, Hashtable会出现问题).
    因为我们一般都是用对象内存地址来比较。
    你看Object类的源码就知道。 equels()和 hashCode()里面,都是用对象内存地址来比较的。我们要保证的就是:命令A和命题B同时成立!!!
    方法就是通过  命题A ===》命题B
    现equels()不是用对象内存做比较了,所有,我们要保证命题B成立,就必须用命题
    A中的变量 bal 和 code 。只要这两个变量组合的hashCode一样就行。

      

  4.   

    C , D选项中 :bal 和 code 两个变量组合的hashCode相等,所以正确 。
      

  5.   

    SortOf a = new SortOf();
    SortOf b = new SortOf();
    a.code = "A";
    b.code = "B";
    a.bal = 1;
    a.rate = 2;
    b.bal = 2;
    b.rate = 1;a.equals(b) = true;
    a.hashCode()=1;
    b.hashCode()=2;
      

  6.   

    如果有两个对象
    aInstance
    code=“abcd”//lenght=4
    bal=2
    rate=3bInstance
    code="efgh"//length =4
    bal=3
    rate=2如果按照D
    ((SortOf)o).code.length() * ((SortOf)o).bal * ((SortOf)o).rate =4*2*3=4*3*2=24
    也就是说equls相等
    但此时aInstance的hashcode=4*3=12
    bInstance 的hashcode=4*2=8
    也就是说当equals相等时这两个对象的hashcode不相等。所以显然D是不对的。
      

  7.   

    我觉得:当这个类的对象被用作map的键值时,调用hashCode,只要这两个对象的hashCode相等就可以认为是相同的键值了,那么equals函数没理由不认为这是两个相同对象,所以C没问题,所以只要满足这两个相等就OK拉,至于需不需要再加上另外一个short的变量,加上也可以,不加上也可以,无关紧要,所以D也对。这是个逻辑问题。
    LZ说的那种情况应该是hashCode为false,但是short类型都为0的情况吧,只能说题目不严谨喽