《think in java》中有这么一段话:如果想比较两个对象的实际内容是否相同,又该如何操作呢?此时,必须使用所有对象都使用的特殊方法equals()。但这个方法不适用于"基本类型",基本类型直接使用==和!=即可。如:Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(ne.equals(n2));正如我们预计的那样,此时得到的结果是true。但事实上并不总是这么简单!假设您创建了自己的类,像下面这样:
class Value{
int i;
}
public class Test{      public static void main(String[] args){
             Value v1 = new Value();
            Value v2 = new Value();
             System.out.println(v1.equals(v2));
    }
}
此时的结果又变回了false!这是由于equals()的默认行为是比较引用。所以除非在自己的新类中重载equals()方法,否则不可能表现出我们希望的行为。大多数Java类库都实现了用来比较对象内容的equals()方法,而非比较对象引用的equals()方法
原文中对equal方法做出了这两种说明:
(比较两个对象的实际内容是否相同)( 这是由于equals()的默认行为是比较引用)
这不是有矛盾吗? 这是为什么?求大神指点一二~~

解决方案 »

  1.   

    没有感觉说的很矛盾啊,你自己的类不为true,是因为你没有重写equals()方法啊
      

  2.   

    Integer n1 = new Integer(47);
    Integer n2 = new Integer(47);
    System.out.println(n1.equals(n2));
    这句不也是没有重写equal方法么
      

  3.   

    首先,Integer 是引用类型int是基本类型。
    基本类型不是类,没有equals()方法。所有类都继承自Object public static void main(String[] args) {
    // TODO Auto-generated method stub
    Object object = new Object();
    Object object2 = new Object();
    System.out.println(object.equals(object2));
    object = object2;
    System.out.println(object.equals(object2));
    }
    输出结果:
    false
    true结论:Object中的equals()是用来比较引用的。延伸:你自己建的类如果不重写equals的话就是比较引用的。
          你常用的一些java基本类中是自己已经重写过equals方法的,所以比较的才是内用,不是引用
      

  4.   

    Integer 是java封装好的类,已经重写过了
      

  5.   

    //这个例子你试试
    public class test2{
    int a=0;
    public test2(int b){
    this.a=b;
      }

     public boolean equals(Object obj) {
     test2 bb=(test2)obj;
     if(this.a==bb.a){
     return true;
     }else{
     return false;
     }
     }  public static void main(String args[]){
      test2 a=new test2(0);
      test2 b=new test2(0);
      if(a==b){System.out.println("等于");}else{System.out.println("不等于");}
      if(a.equals(b)){System.out.println("等于");}else{System.out.println("不等于");}
      
      }
    }
    //上面的结果是 不等于和等于
    //把上面我重写的public boolean equals(Object obj)方法删除
    //删除后结果是 不等于不等于
    //为什么?
    //因为他去调用了系统默认equals,也就是Object类的equals
    //他默认是下面这样比对的,那当然就不等于了
        public boolean equals(Object obj) {
    return (this == obj);
        }
    //所以自己的类需要自己重写equals,当然深入点对比是hashcode开始的。
      

  6.   

    首先,Integer 是引用类型int是基本类型。
    基本类型不是类,没有equals()方法。所有类都继承自ObjectJava code    public static void main(String[] args) { // TODO Auto-generated method stub Object object = new Object(); Object object2 = new Object(); System.out.println(object.equals(object2)); object = object2; System.out.println(object.equals(object2)); }
    输出结果:
    false
    true结论:Object中的equals()是用来比较引用的。延伸:你自己建的类如果不重写equals的话就是比较引用的。
      

  7.   


    你去看下Integer类的源码,他重写了的。
      

  8.   

    Integer是重写了的他的equals就不是简单的this==object了,封装好了的都有重写。
        public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
        }
      

  9.   

    Integer n1 = Integer(47);
    是基础类型包装类,也就是说现在的n1是对象不是int基础类型!把int包装成啦Integer对象类型!
    还有就是Integer这个对象有自己的equals()方法,就是说有自己的怎么比较两个数相等的具体实现。你自己的类Value,也有equals()方法,不过是父类的Object的equals的方法。
    也就是说你比较v1和v2时用的是Object的比较规则,当然不适用你自己的类啦!还有要说的是一般重写equals方法时,一般也要重写hashCode()方法!对楼主的唯一忠告就是多看API文档,,,,,,,,,,看看就知道为什么啦!!!!自己有什么不懂得方法,先查API文档!