经常听人说equlas和==的区别是
equals是比较俩个对象的值.
而==是比较俩个对象的内存地址.
今天我在jdk1.6的源代码中看到java.lang.Object的equals()方法是这样实现的
    public boolean equals(Object obj) {
return (this == obj);
    }这实际上说明equals也是在比较内存地址,因为==本身就是在比较内存地址.
但是经过我的测试
equals确实是在比较值.而==是否在比较内存地址,我就迷茫了,请看例子:
Integer i = new Integer(1);
Integer i1 = new Integer(1);
System.out.println(i.equals(i1));//打印true
System.out.println(i.hashCode() + "   " + i1.hashCode());//打印1    1
if(i == i1) {
System.out.println("success");//什么都没打印
}
我迷茫的前提是,我认为hashCode就是代表内存地址,所以我不确定==是否是在比较内存地址.
换成String结果也是一样.
希望高手能做解答
注:我自己用的jdk1.5 但是看的源代码是1.6的  所以不知道2个版本之间是否有改动.
申明一下这个不是无聊乱研究,我只是没事瞎逛突然一下看到源代码是实现才有所反思的.

解决方案 »

  1.   

    为什么equals可以比较值而==就只能比较地址呢??
    因为equals是个方法,是可以被子类重载的
    所以,Object的equals比较地址是可以理解的,它就是为了让你自己在设计类的时候重写equals方法来达到比较值的效果
    你的例子中比较的是integer,所以你要查的不是object方法的equals的内容,而是integer的
    查查看吧,会明白的
      

  2.   

    首先赞同下4楼的观点.  ==确实是比内存地址的没错..!
    而equals(Object o)是个方法,在别的类里面必要的时候会重写这个方法(当然,重写equals的同时要重写hashcode) 因为每个类都是Object类的直接子类或者间接子类, 而你上面说的Integer和String类, 你有没有看看这两个类里面的equals是怎么实现的呢? 我以前看到过String类equals的方法,代码记得不太清, 实现过程是两个String逐个字符比较. 因为char是可以用==判断值相等的..
    有想法是好事..大家一起探讨下吧
      

  3.   

     public boolean equals(Object obj) { 
    return (this == obj); 
        } 
    this == obj 实际上应该是这样的 this.toString() == obj.toString()
      

  4.   

    equals是比较俩个对象的值. 
    而==是比较俩个对象的内存地址.
      

  5.   

    Object的equals()方法确实的比较的内存地址,但是可以被子类覆盖。自己定义类的时候如果没有重写equals(),默认的也是比较内存地址,但是==就总是比较内存地址。需要的时候,比如说要把自己定义的类放到map里的时候,就要重写equals和hashcode()方法。
      

  6.   

    汗,刚刚写的东西,都不在了,又得重写首先,hashCode返回的是散列码,不是内存地址
    Object类的equal方法,判断的是两个引用所指向的对象是否相同,如果相同返回TRUE
    其他类都默认继承这个类,要想正确比较,必须重写这个方法,举个例子
    class Test{
     private int id;
     private String name;
     ....
     public boolean equals(Object obj){
       if(this==obj){ //首先判断两个引用指向的对象是不是相同,如果相同,肯定相等了,返回TRUE
        return true;
       }
       if(obj instanceof Test){ //判断obj是不是TEST,如果说不是,比较的时候可能出现异常
         Test t = (Test) obj;   // 转型
         if(this.id==t.id ....){ //根据不同类的要求,选取比较条件,
           可以直接根据id是否相等判断this.id==t.id ,也可以根据this.name.equals(t.name)判断,
           当然也可以根据两个条件一起判断this.id==t.id && this.name.equals(t.name)
           return true;
         }
       }
     }
    }
      

  7.   

    这个是java中最常见的问题,,,,百度一下好好研究研究
      

  8.   

    当自定义类作为value时存入Map时不需要重写equals和hashcode()方法吧???
      

  9.   

    楼主可以写个自定义类试试看就知道了,比如:Class Customer{
       private String name;
       private String sex;  //getter and setter...
    }
    现在新建两个实例:Customer c1 = new Customer();
    Customer c2 = new Customer();
    c1.equals(c2); //始终是返回false.这就是因为它继承了Object的equals(Object obj)方法;而String类:String a = new String("abc");
    String b = new String("abc");
    a.equals(b); //返回true,因为String类重写了equals(Object obj)方法
      

  10.   

    唉,楼主你只看了java.lang.Object类的equals实现,却不进一步去看看java.lang.Integer类的equals实现,在Integer类中,Object的这个方法被override了。
      

  11.   

    重写
    你可以打印他们的hashcode看看是否一样
    有些类重写了equal 所以他们不一样
    你可以用String和Stringbuffer分别试一试他们的打印效果就不同
    因为String重写了equal方法二后者没有
    同4楼所说的你查的是object的方法而非integer的equal方法jdk:
     boolean equals(Object anObject) 
              比较此字符串与指定的对象。 
    上面是string的jdk中的equal
    因为除了object外的所有类都继承object
    所以既然string中有此方法就说明 他  已经重写了这个方法具体为:
    equals
    public boolean equals(Object anObject)比较此字符串与指定的对象。当且仅当该参数不为 null,并且是表示与此对象相同的字符序列的 String 对象时,结果才为 true。 覆盖:
    类 Object 中的 equals
    参数:
    anObject - 与此 String 进行比较的对象。 
    返回:
    如果 String 相等,则返回 true;否则返回 false。
    另请参见:
    compareTo(java.lang.String), equalsIgnoreCase(java.lang.String)
      

  12.   

    Object 的equals默认是比较地址的,但是是一般的类都重写了equals,重写了就是按照重写的规则比较了。一般重写就是让它去比较值。
      

  13.   

    Object的equals()方法确实的比较的内存地址,但是可以被子类覆盖。自己定义类的时候如果没有重写equals(),默认的也是比较内存地址,但是==就总是比较内存地址
      

  14.   

    Object的默认实现本来就是比地址。
      

  15.   

    一般自己定义的对象,如果要比较两个对象相等 都得重写equals方法。。至于hashcode()方法也不是很清楚好像不重写也没什么影响。。顺便问下9楼 hashcode方法什么时候需要和equals方法一起重写。。谢谢!
      

  16.   

    "顺便问下9楼 hashcode方法什么时候需要和equals方法一起重写。。谢谢!" 把这个类作为放入HashMap的key,或者是放入HashSet中的时候
      

  17.   

    ==就是比较的内存地质,equals也是比较内存地质的,只不过String和包装类已经重载过了equals方法而已