class MyClass{         int x;         MyClass(int i)         {                     x = i;         }                              public static void main(String args[])         {                     MyClass m1 = new MyClass(100);                     MyClass m2 = new MyClass(100);                      if(m1.equals(m2))                     {                                 System.out.println("Both are equal");                     }                     else                     {                                 System.out.println("Both are not equal");                     }         }                     }为什么
输出是:Both are not equal而不是 Both are equal ?

解决方案 »

  1.   

    equals比较的是对象引用!这是两个对象,当然不会相等了!
      

  2.   

    m1是不同的两个对象m2,虽然它们类型相同,都是MyClass,
    但在内存的不同位置上
      

  3.   

     if(m1.equals(m2)) 是判断m1和m2是否是同一个对象
    因为MyClass   m1   =   new   MyClass(100); 
    和  MyClass   m2   =   new   MyClass(100); 
    分别用 new 产生的MyClass的两个对象,所以 if(m1.equals(m2)) 的结果是false
      

  4.   

    先看看Object源代码中equals方法,再看看String或者Integer的equals方法。再看看自己的代码。
      

  5.   

    如果两个对象进行equals比较时如果返回true,那么它们的hashcode要求返回相等的值,你可以重写一个hashcode()这个方法,只要返回值一样就会出现你要的结果!
      

  6.   

    你比较的是两个对象,而你又没有重写Object类的equals方法
    它就调用Object类的equals的方法,而这个方法是根据Object类的hashCode方法
    来判断,在Object类中hashCode方法返回的是对象的地址,
    所以你的结果总是不相等
      

  7.   


    顶个
    String s1="abc";
    String s2="abc";
    hashCode()相等
      

  8.   

    你的MyClass类并没有重写equals()方法
    所以它只是调用Object中的equals()方法代码如下:
    public boolean equals(Object obj) {
    return (this == obj);
    }
    可以发现这个方法是用来比较两个引用是否指向同一个对象的,所以会返回false而String中重写了equals()方法,比较的是内容,代码如下:
    public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
    return false;
    }
    return true;
        }
    }
    return false;
       }
      

  9.   

    首先要判断你比较的是什么,是基本数据类型还是对象类型,如果基本数据类型,比如int那么equals就是比较他的值(其中String比较特殊,因为每次他都是以一个新的实例出现),如果对象类型的话,需要考虑重载这个对象的一些方法。至于为什么会这样,如果你用过java的clone就明白,如果clone对象类型要小心,因为他只是clone引用,而基本数据类型是跟着类走的。再说要重写方法。每个类是自动继承Object 那么Object里定义equals是比较toString() toString里定义是他的getClass().getName+"@"+hashcode 而每个类的实例对应一个hashcode (他是一个散列玛)所以你想要你的MyClass相等 必须重写 hashcode ,toString 这2个方法 才能达到你想要的效果。
      

  10.   


    而这样是相等的
    public class MyClass{ int x; MyClass(int i) { x = i; } public static void main(String args[]) {
    String s1=new String("a");
    String s2=new String("a"); if (s1.equals(s2)) { System.out.println("Both   are   equal"); } else { System.out.println("Both   are   not   equal"); } }}
      

  11.   

    equals比较的是对象引用!这是两个对象,当然不会相等了!如果两个对象进行equals比较时如果返回true,那么它们的hashcode要求返回相等的值,你可以重写一个hashcode()这个方法,只要返回值一样就会出现你要的结果!
      

  12.   

    equals只是数值上的相等,在内存上可能分配不同的空间。
      

  13.   


    对于String型比较的是内容是否相同