两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对
这是一道java笔试题,大家帮我看看

解决方案 »

  1.   

    不对,equals是根据hashcode来判断的
      

  2.   

    错的的,在重写equals方法时,一定要重写hashcode方法。判断两个对象的值是否相等的步骤:
    先判断是否为null,如果 为null,直接返回false;再次判断是否是同一个类的对象。如果不是同一个类的对象,就没必要比的了(比如:人和一台电脑来比根本就没有意义),直接返回false;再次比较hashcode值是否相等。相等才返回true,否则返回false;从这个逻辑可以看出,两个对象的equals相等,一定有相同的hashcode值。反过来说就对了。有相同的hashcode值,这两个对象不一定相等....
      

  3.   

    equals方法注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
    原则是要求有一样的hashCode,但是不重写也是可以的啊,不重写就不保证相等了
      

  4.   

    这句话应该是对的啊。
    对象equals了,我们就认为他们是相等的了,而一般不去判断它的hashcode,但是在对象做索引的时候就会去重写hashcode方法
    其他的时候就没必要去重写了。
      

  5.   


    public class Person {

    private static int i = 0;
    @Override
    public boolean equals(Object obj) {
    return true;
    } @Override
    public int hashCode() {
    return i++;
    }

    public static void main(String[] args) {
    Person person1 = new Person();
    Person person2 = new Person();
    System.out.println(person1.equals(person2));   //输出true
    System.out.println(person1.hashCode()==person2.hashCode()); //输出false
    }
    }
      

  6.   

    所以说这个应该是理论上的一个规范, 但是不是必然联系。因为只要可以overwrite, 就不存在一定相等的定论。
      

  7.   

    对的
    equals比较的是内容吧!hashcode指的的是分配内存空间的一个编码
      

  8.   

    这个是java堆和栈的问题,如果是对象和值应用的问题,楼主看看这个对您有帮助
    http://blog.csdn.net/myjava_024/archive/2008/11/26/3376555.aspx
      

  9.   


    hashCode 的常规协定是: 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 
    如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。 
    如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 


    两个对象值相同(x.equals(y) == true),但却可有不同的hash code
    是正确的  是可以有不同的hashcode的
    但是一般不应该这样做  这样不利于提高哈希表的性能   程序员应该意识到,为相等的对象生成相等的hashcode ,为不相等的对象生成不同整数结果可以提高哈希表的性能。 hashcode返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能当equal方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码
      

  10.   

    equals()相等的两个对象,hashcode()一定相等; 
    equals()不相等的两个对象,却并不能证明他们的hashcode()不相等
      

  11.   

    public static void main(String[] args) {
    String b = new String("123");
    String a="123";

            System.out.println(a.equals(b));   //输出true
            System.out.println(a.hashCode()==b.hashCode()); //输出false
            System.out.println(a==b);//true
    }
      

  12.   

    不好意思上面写错了
    public static void main(String[] args) {
    String b = new String("123");
    String a="123";

            System.out.println(a.equals(b));   //输出true
            System.out.println(a.hashCode()==b.hashCode()); //输出true
            System.out.println(a==b);//false
    }
      

  13.   

    If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
      

  14.   

    If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
      

  15.   

      大哥 你要是没重写hashcode或者equals方法的话  第二行怎么可能是false呢。 而且a==b明显输出false
      

  16.   

    String x = "test";
    String y = "test";

    String a = "te";
    String b = a ;

    System.out.println(x.equals(y));
    System.out.println(x.hashCode() == y.hashCode());

    System.out.println(a.equals(b));
    System.out.println(a.hashCode() == b.hashCode());我这里全部都是true  
      

  17.   

    public class Test {
    public static void main(String[] args) {
    A a1 = new A(1) ;
    A a2 = new A(2) ;

    System.out.println(a1.equals(a2)) ;
    System.out.println(a1.hashCode()+" : "+a2.hashCode()) ;
    }
    }
    class A{
    private int i ;
    public A(int i){
    this.i = i ;
    }

    public boolean equals(Object a){
    return true;
    }

    public int hashCode(){
    return this.i ;
    }
    }
      

  18.   

    如果重写了equals而没有重写hashCode, 那就会equals结果为true, 而hashCode为false.说对, 说不对, 都对.   虽然一般重写equals一定会重写hashCode, 但又没有硬性规定一定要重写hashCode.
      

  19.   

    不对,在重写equals方法时,一定要重写hashcode方法
      

  20.   

    两个对象相等,那么一定有相同的hashcode
    两个对象有相同的hashcode,不一定相等
      

  21.   

    equals 和hashcode 没有必定的联系
    只是在文档中建议:
    如果重新了equals方法的话,最好重新hashcode方法。
    如果这样说的话,那就相等
    但是那不是必须的
    两个对象相等 他们的hashcode不一定相等
      

  22.   

    这句话当然是对的。equals方法和hashCode方法是两个方法,他们并不互相影响,只是按规则来说,推荐同时重写他们,但不重写也没关系。
      

  23.   

    对的就跟 我写个方法  x.bijao(y)  来判断 x,y 值相同不一样   我在bijiao()方法中如何实现的是否使用了hashcode() 有明确的要求吗?equals() 与 hashcode() 只是推荐要重新 而且在一些集合等 排除重复或排序的地方会用到 这2个方法只不过就是2个继承来的方法而已 不会比其他的 自定义方法多条胳膊多条腿的
      

  24.   

    2楼说的只是JDK上的建议
    实际当中有可能发生这种情况的
      

  25.   

    这样说不对的,在重写equals方法时,一定要重写hashcode方法。判断两个对象的值是否相等的步骤:
    先判断是否为null,如果 为null,直接返回false;再次判断是否是同一个类的对象。如果不是同一个类的对象,就没必要比的了,直接返回false;再次比较hashcode值是否相等。相等才返回true,否则返回false;从这个逻辑可以看出,两个对象的equals相等,一定有相同的hashcode值。反过来说就对了。有相同的hashcode值,这两个对象不一定相等。仅供楼主参考。
      

  26.   

    值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中
    ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。</div>
    equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
     ==比较的是2个对象的地址,而equals比较的是2个对象的内容。
    显然,当equals为true时,==不一定为true;</div>
      

  27.   

    你看看源代码中 Object类 和 String类中 的 equals方法是怎么写的?
      

  28.   

    晕,你x , y 两个String引用的是同一个字符串,返回当然是true了
      

  29.   


    我简单说两句:
       两个对象相等不一定具有相同的hashcode,
       但是hashcode相同,却是相同的对象。
      所以,人家的笔试题说的是正确的。
      

  30.   

    hascode比较的是地址,这个是对的
      

  31.   

    这个x和y在内存中相等的话,应该是同一块hashcode。但是反过来,如果说x和y数值相等,但是x和y是在不同的内存区的,那么这个就不是TRUE了,true了,也就是一块区域了吧
      

  32.   

    记住4个规则,不是我定的,是jdk文档定的
    如果两个对象equals相等,其hashcode必相等。
    如果两个对象equals不等,其hashcode可能相等,可能不等。
    如果两个对象hashcode相等,其equals可能相等,可能不等。
    如果两个对象hashcode不等,其equals必不等。
      

  33.   


    楼主的前提是equals结果是相等的,所以hash code一定是相等的。我认为你的分析比较到位。
      

  34.   

    我认为是错的。
    楼主可以去看看《Effective Java》,里面有讲这个
      

  35.   

    明显是错的,两个对象equals为true,hascode值一定相等。hascode值相等,equals不一定为true。
      

  36.   

    对的String,Integer这些类都重写了equal和HashCode方法。其他Object进行比较的时候都要重写这两个方法,只重写equals方法不重写HashCode方法的话就会有一个true一个false的结果。
      

  37.   

    首先,hashcode在Java中是唯一的,所以equal相等,hashcode必须相等,否则就违背了Java的规则。hashcode在集合中查找元素时很重要,好的hashcode算法能加快查找速度。
      

  38.   

    14楼一针见血!
    在一般的应用中你不需要了解hashcode的用法,但当你用到hashmap,hashset等集合类时要注意下hashcode。 你想通过一个object的key来拿hashmap的value,hashmap的工作方法是,通过你传入的object的hashcode在内存中找地址,当找到这个地址后再通过equals方法来比较这个地址中的内容是否和你原来放进去的一样,一样就取出value。 所以这里要匹配2部分,hashcode和equals 
    但假如说你new一个object作为key去拿value是永远得不到结果的,因为每次new一个object,这个object的hashcode是永远不同的,所以我们要重写hashcode,你可以令你的hashcode是object中的一个恒量,这样永远可以通过你的object的hashcode来找到key的地址,然后你要重写你的equals方法,使内存中的内容也相等 
      

  39.   

    值相同,内存地址不一定相同
    如:
    public class T { public static void main(String[] args) {
    int a=0;
    int b=0;
    T t = new T();
    T t1 = new T();
    a=t.hashCode();
    b=t1.hashCode();
    if(a==b){
    System.out.println("true");
    }
    }}
      

  40.   

    equals方法需要重写,否则他跟“==”没什么区别,“==”相同有两个条件,第一、需要值相同。第二、需要内存地址相同,所以一般都需要重写equals方法
      

  41.   

    JAVA\NET\PHP\SQL\C系列软件技术交流学习基地
    群号:100613346  欢迎你加入大家庭
      

  42.   

    Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes. (API) API是这么规定的。
      

  43.   

    是对的,我曾见过某个高手程序,只是重载了equal方法可以不用重载hashcode的,只是建议一起重载最好