记得==比较的是地址是否相等,equals是比较的内容是否相等
 
那么class Demo2{
 
        
 
}
 
public class ObjectDemo {
 
        public static void main(String[] args) {
 
                Demo2 d1=new Demo2();
 
                Demo2 d2=new Demo2();
 
                Demo2 d3=d1;
 
                
                System.out.println(d1.equals(d3));
 
                System.out.println(d1.equals(d2));
 
                System.out.println(d1==d2);
 
                System.out.println(d1==d3);
         }
 }的结果为:
 true
 false
 false
 true
 
分析:
 1、d1.equals(d3),是比较两个的内容是否相等的,是true
 
2、d1.equals(d2) ,两个内容也是一样的啊?,为什么是false???

解决方案 »

  1.   

    d1.equals(d3)结果是true,是因为你在上面的Demo2 d3=d1;这个操作,意思是让d3指向d1所指向的地址,所以d3和d1指向同一个位置,反回的就是true.而d1.equals(d2)结果是false,是因为 Demo2 d2=new Demo2();这个操作,d2是新new了一个类,d1也是新new的一个类,这时候就会有两个一样的Demo存在内存中,但d1和d2的地址是不同的,所以返回的就是false.
      

  2.   

    “记得==比较的是地址是否相等,equals是比较的内容是否相等”
    如果Demo2类里没有重写 equals,那么继承Object的equals方法,其原码是:    public boolean equals(Object obj) {
            return (this == obj);
        }还是比较的地址。只有重写了equals方法,使其比较对象的内容,才如楼主所说。
      

  3.   

     Demo2 d1=new Demo2();   //这里是个新对象   得到的对象是个字符码  都不一样的
      
     Demo2 d2=new Demo2();   //这里是个新对象
      
      Demo2 d3=d1;   //这个就是赋值了  把d1的值赋值给d3   
    所以比较是不一样的
      

  4.   

    打个比方,有一个生产洗衣机的厂家,然后有三个人,小A,小B和小C,小A去厂家制造了一台洗衣机,然后回家去用了,小B也要洗衣服,然后去厂家也造了一台,这时候就有两个同样型号的洗衣机给两个不同的人用。后来小C也要造一个洗衣机,但厂家发现零件不够用了,小C和小A是邻居,小A就把洗衣机借给小C了,这时候小A和小C用的就是同一个洗衣机,是相同的,也就是d1.equals(d3)结果是true,虽然小B的洗衣机是同一个厂家出的同型号的,但小A用的洗衣服和小B一点儿关系也没有,所以小A和小B是不同的,故而d1.equals(d2)结果是false。这样也就是说如果你这么比较d3.equals(d2)结果也会是false,因为小C和小B也没啥关系。
      

  5.   

    d1对象与d2对象当然不一样的喽,完全两个对象,虽然都在以null形式存在于堆内存里,但地址不一样.
      

  6.   

    http://www.ticmy.com/?p=186
      

  7.   


    这位仁兄回答的比较直接一下,前段时间翻java编程思想的时候上面就着重提到了这个点,赞一个
      

  8.   

    ==是地址,equals看里面的方法写的什么了,string是值相同
      

  9.   

    看一下object的equals实现。再看看String 的equals实现。再看看你自己的例子的equals实现就可以了
      

  10.   

    d1,d2在堆中创建两个对象 ,d3和d1指向的是同一个
      

  11.   

    你在程序中new了以后,内存地址不一样,自然不会相同啥!
      

  12.   

    基本类型比较用 ==  非基本类型(String,对象)用equals 
    我看楼主想太多了
      

  13.   

    如果没有重写object的equals()方法,就会调用object的equals()方法,而String重写了equals()方法,自己去看下底层怎么实现的吧。
      

  14.   

    不做多解释, ==直接比较内存引用,equals如果不重写默认就是 == ,重写了就你自己想怎么比就怎么比
      

  15.   

    2L正解。你新写的类要重写equals方法才能实现判断内容相同,而默认情况下equals方法继承object的equals方法,与==一样判断二者地址是否相同
      

  16.   

    (单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起
    说,则很难说清楚)
    ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
    如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj 是一个内存,new Object()是另一个内存,此时,变量obj 所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
    equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
    String a=new String("foo");
    String b=new String("foo");
    两条new 语句创建了两个对象,然后用a,b 这两个变量分别指向了其中一个对象,这是两个不
    同的对象,它们的首地址是不同的,即a 和b 中存储的数值是不相同的,所以,表达式a==b 将
    返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
    在实际开发中, 我们经常要比较传递进行来的字符串内容是否等, 例如, String input
    = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几
    个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用
    equals 方法。
    如果一个类没有自己定义equals 方法,那么它将继承Object 类的equals 方法,Object 类的equals
    方法的实现代码如下:
    boolean equals(Object o){
    return this==o;
    }
    这说明,如果一个类没有自己定义equals 方法,它默认的equals 方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals 和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals 方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
      

  17.   

    equals类,实质上是对比他们内存的地址串
    等效(d1.toString()).equals(d3.toString()),这样结果肯定是false了
      

  18.   

    d1与d2是两个已经实例化出来的对象,它们就会对应有一段固定的存储空间,而每一个存储空间都有一个对应的地址,d3=d1则是将d1的地址复制一份给d3,也就是说d1与d3就像指针一样同时指向同一个存储空间。equals主要用在字符串之间的比较,==主要用于数字之间的比较,对于存储空间的地址来说是有一串数字组成的,也可以看作字符串,所以d1=d2为false,d1=d3为true,d1.equals(d3)为true,d1.equals(d2)为false。