值相同使用equals方法来判断,equals方法重写后不一定是判断对象是否是同一个对象
所以hashcode不同是很正常的
就好比我定义个类,有名字和编号
我重写equals方法,让名字相同就返回相等
那么我虽然有hashcode不同的两个对象(他们的编号都可以不同,或者两个对象的所有属性值都一样)
但他们的hashcode当然不同
因为根本就不是一个对象嘛

解决方案 »

  1.   

    这句话是对的equal的对象未必hashcode相同
    反过来,hashcode相同也未必equal
      

  2.   

    1. 在同一应用中,一个对象的hashCode函数在equals函数没有更改的情况下,无论调用多少次,它都必须返回同一个整数。 
    2. 两个对象如果调用equals函数是相等的话,那么调用hashCode函数一定会返回相同的整数。 
    3. 两个对象如果调用equals函数是不相等的话,那么调用hashCode函数不要求一定返回不同的整数
      

  3.   

    但是一般重写equals 要同时重写 HashCode
      

  4.   

    这句话是错误的。两个对象实例不同,hash code可以相等,因为没有完美的hash函数。
    反过来说的话,就是错误,因为你不能保证类的使用者不使用HashSet/HashMap
      

  5.   

    这句话是对的。
    equals和hashCode是两个方法,都可以重写。
    所以关键看你如何重写这两个方法。
      

  6.   

    最后一句话错了 hashCode是对象的唯一标记 如果说两个对象的唯一标记相等 其equals的结果必须相等http://blog.csdn.net/KindAzrael/article/details/4633615
      

  7.   

    理论上讲1,2楼是对的,但是按照正常的业务逻辑,除非是神经病要不然重写equals方法和hashCode方法的一定尽量是equals为真,hashCode相等
      

  8.   


    hashcode不是唯一标记,如果依赖它来进行equal判断,自然就必须相等,如果不依赖它做equal判断,它就啥也不是
      

  9.   

    直接上API
    public boolean equals(Object obj)指示某个其他对象是否与此对象“相等”。 
    equals 方法在非空对象引用上实现相等关系: 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。 
    对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。 
    传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。 
    一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。 
    对于任何非空引用值 x,x.equals(null) 都应返回 false。 
    Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 
    参数:
    obj - 要与之比较的引用对象。 
    返回:
    如果此对象与 obj 参数相同,则返回 true;否则返回 false。
    -----------------public int hashCode()返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。 
    hashCode 的常规协定是: 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 
    如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。 
    以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。 
    实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。) 
    返回:
    此对象的一个哈希码值。
      

  10.   

    但,API中指出的只是一个协定, 并没有强迫你一定要这么干
      

  11.   

    两个对象相等,hashcode肯定一致…
      

  12.   

    答案 equals(2楼)  但我的回复不在2楼,----->   hashCode()当然可以不同
      

  13.   

    最后一句话错了 hashCode是对象的唯一标记 如果说两个对象的唯一标记相等 其equals的结果必须相等http://blog.csdn.net/KindAzrael/article/details/4633615 System.out.println("Aa".hashCode());
    System.out.println("BB".hashCode());
      

  14.   

    不对,有相同的hash code。 
      

  15.   

    最后一句话错了 hashCode是对象的唯一标记 如果说两个对象的唯一标记相等 其equals的结果必须相等http://blog.csdn.net/KindAzrael/article/details/4633615
    为什么是错的,你又没有说这个equal有没有被重写过,重写过就不一定是用hashCode比
      

  16.   

    楼主,我测试过,对于Object类有equals相等必有hashCode相等。看API很容易理解。
    对于String类,该结论同样成立。
    对于其他自定义类,该结论是不确定的,要依赖于equals和hashCode的具体实现。
      

  17.   

    public class Test {
    public static void main(String[] args) {
    Test aTest = new Test();
    Test bTest = new Test();
    System.out.println(aTest.equals(bTest));
    System.out.println(aTest.hashCode() + "----" + bTest.hashCode());
    }

    @Override
    public boolean equals(Object obj) {
    return true;
    }

    @Override
    public int hashCode() {
    return super.hashCode();
    }
    }
    //运行结果
    true
    12830537----22068557
    所以这句话肯定是对的
      

  18.   

    按照API规定,可总结如下:equal相等,hashcode也一定相等 ; hashcode不等,equal也一定不等但是如果不按照规定来的话,hashcode就没有什么意思了,所以再去比较也没什么意思了。