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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ying 中级黑马   /  2012-12-30 20:28  /  2072 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ying 于 2013-1-8 13:14 编辑

     今天一个同学问我java中比较两个对象或者两个值时使用“==”和“equals();”有什么区别!
比如:
   String str1 = "Hello world";
               
     String str2 = new String("Hello world");

    System.out.println(str1 == str2);
     // 打印出来的是 false
     System.out.println(str1.equals(str2));
      //打印出来的是true
    //为什么一个是false一个是true

4 个回复

倒序浏览
简单得说 == 就是一般数值比对的 equals 用于字符串比对。
回复 使用道具 举报
==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。

根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。
对象内容的比较,正是equals方法做的事。

看一下Object对象的equals方法是如何实现的:
boolean equals(Object o){

return this==o;

}
Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出,Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。

看一下一个极端的类:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}

}
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。

所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 刘文超 于 2012-12-30 22:40 编辑

lz你好,给你最简单准确的回答:
1、==返回的结果是两个引用是否指向同一对象;
2、正常情况下equals和==是完全一样的,从作用上讲是没有任何区别的;
3、特殊的情况:equals()可以自己重写即覆盖掉父类的该方法,我们自定义它的具体实现过程(我们自己敲的HelloWorld也可以重写哦),而String类又重写了该方法、它是这样定义的:返回的是判断两个字符串是否  匹配相等,而不再是基类中判断两个引用是否指向同一对象了。【equals()是我们java根基类Object中的一个方法,任何类都默认继承Object类】
lz,理解清楚否,如果还有不明之处,可以再联系我;
-------接分中------

评分

参与人数 2技术分 +1 黑马币 +4 收起 理由
冯海霞 + 1
qiuyinglanshan + 4 很给力!

查看全部评分

回复 使用道具 举报
lz可以这样理解: ==比较的是栈内存中的引用 是否相等,equals比较的是堆内存的引用对象的值 就像您的例子 我用//标志
  String str1 = "Hello world";            //这里开辟一个堆内存空间
  String str2 = new String("Hello world");//这里又开辟一个堆内存空间
    System.out.println(str1 == str2);
     // 打印出来的是 false //栈内存中str1和str2的值肯定是不同的,因为开辟了两个堆空间,栈内存中两个变量中存储的引用地址值不同.
     System.out.println(str1.equals(str2));
      //打印出来的是true //这里是因为equals比较的是堆内存中引用对象的值,故打印出来时true
   

望对您有所帮助,若我的回答有误,请回复我哈,大家共同学习,哈~

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

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