A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐升2013 中级黑马   /  2013-3-9 22:25  /  1640 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 徐升2013 于 2013-3-9 22:26 编辑

public class testEquals
{
        public static void main(String args[])
        {
                testEquals a = new testEquals();
                testEquals b = new testEquals();
                testEquals c = b;
                if(a == b)
                        System.out.println("==a和b内存指向相同");
                if(b == c)
                        System.out.println("==b和c的内存指向相同");
                if (a.equals(b))
                        System.out.println("a和B equals比较内容相同");
                if (b.equals(c))
                        System.out.println("B和C equals比较内容相同");
        }
}
运行结果为:   ==b和c的内存指向相同                        B和C equals比较内容相同

代码如上 很简单的,就是问下equals不是比较内容是否相同的么?为什么都是默认的初始化  比较结果缺不同呢?

点评

论坛中类似的问题很多,你可以搜索一下,可以学到更多的  发表于 2013-3-10 09:26

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

13 个回复

倒序浏览
又写了第二个代码,还是不行,代码如下,求解答- -
public class testEquals
{
        testEquals(String sm){}
        public static void main(String args[])
        {
               
                testEquals a = new testEquals("java");
                testEquals b = new testEquals("java");
                if (a.equals(b))
                        System.out.println("内容相同");
        }
}
回复 使用道具 举报
==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同;当用于引用类型的时候,是比较对象是否相同
    如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj =new      Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
    
equals方法是用于比较两个独立对象的内容是否相同,它比较的两个对象是独立的。
     a 和 b 存的是地址,你new 了两个对象,这两个对象在内存中分别开辟了空间,a 和 b 的值 是这两个不同空间的地址,当然不同了。

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

回复 使用道具 举报
Objeck类中equals(Object obj)方法 :指示其他某个对象是否与此对象“相等”。
         
回复 使用道具 举报
如果你创建的是Integer等对象的话,确实是你说的那样,那时因为Integer类复写了equals()方法
而testEquals类的equals()方法是直接继承自Object类,比较的还是引用类型的值,也就是所指向对象的内存地址值。
回复 使用道具 举报
a.equals(b);
具体结果是什么,要参照a,b的类型做决定。
如果是自己写的新类型,那默认比较的是对象的首地址是否一样。
如果是比较基本数据类型(Integer、String、...)这些,最好是查看API文档,它们有对equals进行了复写,比如Integer是比较数值是否相等,String比较内容
回复 使用道具 举报
        1:equals()比较的是内存地址值(也叫hash码),内存地址值是在创建对象的时候分配的
        2:都是默认的初始化,比较结果缺不同呢?:你上面new对象,没有显示赋值,默认为null;
        3:对象==也是比较地址值,你明白了吧   
                testEquals a = new testEquals();//new一次堆中就开辟了块空间
                testEquals b = new testEquals();//new一次堆中就开辟了块空间  地址值肯定就不同了
                testEquals c = b;                     //c指向b 地址值就是同一个
所以结果你应该懂了
                if(a == b)false     
                if(b == c)true      
                if (a.equals(b))false   
                if (b.equals(c))true
回复 使用道具 举报
一般euqals 没有被重写时,自己定义的类,默认继承Object类。在Object类中,equals 与== 作用是相同的。都是比较句柄地址。
声明格式为:  public  boolean equals(Object obj)
所以equals的比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.  
楼主new了两个不同的对象,a与b. 并在栈内存中开辟两个空间,指向a,b。所以a,与b不为同一个对象。 testEquals c = b;这里,把b的地址值给了c,故,b.equals(c)为true.
所以结果为:==b和c的内存指向相同                        B和C equals比较内容相同

评分

参与人数 1黑马币 +12 收起 理由
黄玉昆 + 12 鼓励鼓励

查看全部评分

回复 使用道具 举报
樊玲 发表于 2013-3-9 23:52
一般euqals 没有被重写时,自己定义的类,默认继承Object类。在Object类中,equals 与== 作用是相同的。都 ...

在 testEquals c=b,这里,c指向了b 。。
回复 使用道具 举报
                        testEquals a = new testEquals();//开辟了块空间 a为引用
                testEquals b = new testEquals();//new又开辟了块新空间  
                testEquals c = b;                     //把b赋值给c  ,b,c指向同一块内存空间,即指向同一个对象,if(a == b)false     
            
               if(b == c)true      
                if (a.equals(b))false   
                if (b.equals(c))true
回复 使用道具 举报
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
所以   运行结果为:   ==b和c的内存指向相同                        B和C equals比较内容相同

回复 使用道具 举报
在Object类中 equals 可不是用来比较内容相同的  而是用来比较地址值是否相同 和==一样   
只是String类复写了Object类的equals方法 用来比较两个字符串是否内容相同  你的类是继承Object的  呵呵
回复 使用道具 举报
小路飞 来自手机 中级黑马 2013-3-10 08:25:03
13#
戴乾刚 发表于 2013-3-9 23:12
如果你创建的是Integer等对象的话,确实是你说的那样,那时因为Integer类复写了equals()方法
而testEquals ...

正解,必须要重写equals()方法才能判断内容是否相同。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马