第二次比较时应使用:System.out.println(v1.i.equals(v2.i));v1.equals(v2):比较的是类的引用,两个引用之间肯定是不等的。

解决方案 »

  1.   

    Integer重写了equals方法,你的类没有!
      

  2.   

    think in java
    应该写得很清楚吧,
    关于·自定义的类·需要重写equals方的事,
    还有toString方法,
    搂住再好好度一下。除了这个,自定义的类和java内置的类在使用上还有什么不同呢?
    没有。
    都是类怎么会有不同呢。
    之所以觉得不同是还没有了解根超类Object的概念而已。
    嗯,如果硬要说有的话,
    也是有的。
    自己写的可以改,
    觉得那里不合时,
    想怎么改就怎么改,
    ·java内置的类·没有特殊必要是不应该更改的。呵呵,
    胡说了。
      

  3.   

    Value中没有重新定义equals方法。
      

  4.   

    flankerxiao(肖华) 所说的:第二次比较时应使用:System.out.println(v1.i.equals(v2.i));
    我试了试,不能通过编译,提示
    C:\j2sdk1.4.2\execise>javac Equalsmethod3.java
    Equalsmethod3.java:12: int cannot be dereferenced
                    System.out.println(v1.i.equals(v2.i));而且如果说v1.equals(v2)比较的是类的引用(两个引用之间肯定是不等的)
    那么,难道Integer重写过的equals方法就不是了么,如果不是的话,那是什么呢?
    继续请教!
      

  5.   

    呵呵, cold_blooded(三天没吃饭) 说得很有意思,受教!
      

  6.   

    >>>>为什么自定义的类和java内置的类在使用equal方法时会有这样的的区别呢?  如果自定义类没有覆写equals方法的话,那么当调用equals方法的时候,由于默认的继承至Object类,调用的是Object类的equals方法.而Object类的equals方法默认的行为便是比较两个对象的引用.
       很显然,v1和v2指向了两个不同的对象(只是这两个对象的一个数据域相等了而已).因此,equals返回了false.对于提及的Integer类,它是覆写了Object.equals方法的,那么比较的时候会按照它自己施加的逻辑进行比较,而不会使用 Object.equals方法.   如果你要想你的类有一个正确的(符合期望的)比较结果,那么你得覆写equals方法(推荐一并覆写hashCode方法),像这样:class Value
    {
    int i;
       public boolean equals(Object obj){
         if(!(obj instanceof Value))//如果不是Value类型的
            return false;
         Value v = (Value)obj; //是Value类型的,Cast不会出错
         return (v.i == i); //这可能是你期望的方式
      }
    }   
      

  7.   

    第二次比较时应使用:System.out.println(v1.i.equals(v2.i));v1.equals(v2):比较的是类的引用,两个引用之间肯定是不等的。
    同意,但是,System.out.println(v1.i.equals(v2.i));
    会出错
      

  8.   

    >>>>>flankerxiao(肖华) 所说的:第二次比较时应使用:System.out.println(v1.i.equals(v2.i));---->
    System.out.println((v1.i) == (v2.i)); //应该可行,但不推荐如此进行对象的比较
      

  9.   

    你自己写的类的equals()方法是继承Object类的equals()方法,那可不是比较一个属性值的大小的
    而Integer类已经重写了equals()方法,比较的就是那个int值的大小
    很简单的啊
      

  10.   

    equals主要是比较值的,
    == 就是关于对象的比较了,看看下面就知道了public class Difference{ 
    String a1 = "difference"; 
    String a2 = new String(a1); 
    String a3 = "diff"+"erence"; public static void main(String[] args){ 
      Difference diff = new Difference(); 
    System.out.println("a1==a2  "+(diff.a1==diff.a2)); 
    System.out.println("a1==a3  "+(diff.a1==diff.a3)); 
    System.out.println("a2==a3  "+(diff.a2==diff.a3)); 
    System.out.println("diff.a1.equals(diff.a2)  "+(diff.a1.equals(diff.a2))); 
    System.out.println("diff.a1.equals(diff.a3)  "+(diff.a1.equals(diff.a3))); 
    System.out.println("diff.a2.equals(diff.a3)  "+(diff.a2.equals(diff.a3))); 

    } 输出结果是: 
    a1==a2  false 
    a1==a3  true 
    a2==a3  false 
    diff.a1.equals(diff.a2)  true 
    diff.a1.equals(diff.a3)  true 
    diff.a2.equals(diff.a3)  true 
    Press any key to continue... 
      

  11.   

    理解equals()与==运算符的去别
    前者是比较(对象)变量值是否相等
    后者是指是否指向内存单元中的同一对象
      

  12.   

    你的Value类应该这么写:
    class Value
    {
    private int i;
    public Value(int i)
    {
    this.i=i;
    }
    public int intValue() {
    return i;
        }
    public boolean equals(Object obj) {
    if (obj instanceof Value) {
        return i == ((Value)obj).intValue();
    }
    return false;
        }
    }Interger 就是这么干的.你直接写成: System.out.println(v1.equals(v2));
    而不override equals() 是不选择,因为那样直接比较的是两个引用,v1和v2的地址.
    你可以通过用:
    System.out.println(v1);
    System.out.println(v2);
    看也它们的差异.那个System.out.println(v1.i.equals(v2.i));
    显然也是不行的,因为这就相当于:
    int i= 100;
    int j= 100;
    i.equals(j)一样.
    但 int 是基本类型,它不可以这样做.
      

  13.   

    System.out.println(v1.i.equals(v2.i));
    会出错的原因是v1.i是int,是基本类型,不是对象,所以不可以调用方法
      

  14.   

    不能有(v1.i).equals(v2.i),因为equals比较是类呀。同意楼上的说法
      

  15.   

    这个问题我都回答了n次了,希望这是最后一次
    equals方法在wraper类中是重写object类的equals,object类中的equals就是“==”
    而wraper类中的equals只是比较了内容,不用内存地址
      

  16.   

    自己写的类继承了Object的equals(),Object的equals()缺省是按照reference比较的
    而程序库中的类大多都覆写了equals(),比较的是对象的内容
    就是 treeroot(根根)说的
      

  17.   

    补充一点:  Interger,String 这些内置内不但重写了equals(),还重写了toString(),因此你用
      Interger i;
      System.out.println(i);
      看到的不再是 i 所指向的地址,而是i所代表的值. 因为toString()是这样重写的:
       public String toString() {
    return String.valueOf(i);
        }
      而 System.out.println(i)就相当于System.out.println(i.toString());
      

  18.   

    原Object根类里的toString()是这样子的: public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
      

  19.   

    a.equals(b)方法的默认行为是比较a==b,所以你得到的结果false是正确的(这个Thinking in Java有写)。你想得到和Integer equals那样的意义,需要override这个equals。
      

  20.   

    在 jdk 自带的 src 压缩文件里,有你想要的东西.类的源文件全在那.