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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何创 中级黑马   /  2013-1-15 23:58  /  1674 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-16 10:48 编辑

eqeuals  == 是用来判断对象是不是相等,这个instanceof  到底是做什么用的,怎么用 和他们的区别究竟在哪里,我想知道本质的答案,最好能举例说明 谢谢大家了。

3 个回复

倒序浏览
转载:
呵呵,很经典的问题.详细说一下,别嫌烦哟~
在java程序设计中,经常需要比较两个变量值是否相等。例如
1、简单数据类型比较
a = 10;
b = 10;
if(a == b){
   //写要执行的代码
}
2、引用数据类型比较
ClassA a = new ClassA("abc");
ClassB b = new ClassB("abc");
if(a == b){
//写要执行的代码
}
显然在例1中 a == b的值为true,例2中a == b值为false
你应该有一些java基础吧,下面我用int类型和它的封装类Integer来说明简单类型和封装类型进行比较时的区别:
==和equals()的用法
先看一段代码:
public class TestEqual{
      public static void main(String [ ] args){
            //简单类型比较
       int a = 100;
            int b = 100;

            System.out.println("a == b?" + (a == b));
           //引用类型比较
       Integer c = new Integer(100);
            Integer d = new Integer(100);

           System.out.println("c == d?" + (c == d));           
   }
}
运行该程序,会打印出以下信息:
a == b? true
c == b? false
可以看出,在引用类型比较中,虽然用了同一个参数“100”来构造两个变量,但他们仍然不同。
why??
要知道,对于这两个引用类型变量c和d,他们指向的是两个不同的对象(只不过两个对象的值都是100),因为是指向两个对象,所以比较这两个变量会得到false的值。
注意啦,重要结论:
对于引用类型变量,运算符“==”比较的是两个变量是否引用同一对象。
*************************************************************************************************************
那么如何比较对象的值是否相等呢?
在java中提供了equals()方法用于比较对象的值。我们把上面引用类型部分的程序稍作修改:

Integer c = new Interger(100);
Integer d = new Interger(100);
System.out.println("c equals d?" + (c.equals(d) ));

运行后可得一个true,这是因为,方法equals()进行的是“深层比较”,他会去比较两个对象的值是否相等。

如果你想多学一点,一定会问:“这个可爱的equals()方法是由谁来实现的呢?”
我们知道,java中所有类的父类是Object类,在Object中,已经定义了一个equals()方法,但是这个默认的equals()方法实际上也只是测试两个变量引用是否指向同一对象(即与那个可爱的 == 功能一样)。所以它并不一定能得到你所期望的效果。所以我们还经常需要自己将定义的类(就是上面的TestEqual)中的equals()进行覆盖。像Integer封装类就已经覆盖了Object中的equals()方法,直接可以拿来比较引用类型c和d指向的对象的值。

好了,相信你一定耐心地看到了这里,我们来总结一下
== 和equals()两种比较方法,在使用时要注意:
1、如果测试两个简单类型的数值是否相等,则一定要用“==”来比较;
2、如果要比较两个引用变量对象的值是否相等,则要用对象的equals()方法进行比较;
3、如果需要比较两个引用变量是否指向同一对象,则使用“==”来进行比较;
还有,对于自定义的类,应该根据情况覆盖其父类或Object类中的equals()方法,否则默认的equals()方法功能与“==”相同。

OK!
你的疑问解决了吗?我的叙述你满意吗?
参考资料:《java编程思想》Bruce Eckel著 百度文库里就有

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
在这我画个图  类是Person 两个实例对象 P1 与 p2 ,应该很容易理解了


评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
instanceof是一个二元操作符,它的主要功能是判断一个对象是否是某一类的实例比如创建了一个class A的实例 A a = new A();如果你用a instanceof A那么这行操作完返回的就是true,而a instanceof B返回的就是false。equals是上帝类Object定义的一个方法,所有类继承或者覆写了Object中的equals方法,equals方法一般跟hashCode方法一起被覆写使用,用来最大程度的判断两个对象是否为同一个对象。==也是个二元操作符,它一般用来判断两个变量或者两个引用的内存地址是否相同。所以一般讲来 instanceof用来判断某实例是否属于某类;equals用来判断两个实例是否相等;==用来判断两个变量的值是否相同或者两个引用的内存地址是否相同。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马