黑马程序员技术交流社区

标题: 最近看到一个问题equals和“==”的区别 [打印本页]

作者: 吴刚—heima    时间: 2013-5-28 13:34
标题: 最近看到一个问题equals和“==”的区别
请详细的阐述一下问题所述的内存机制原理,我以前一直以为euqals就是比较两个字符串,‘==’比较的是基本数据类型,但是好像最近在编程的时候好像发现不少i这么回事,请大家解答一下
作者: 顾玲玉    时间: 2013-5-28 13:58
equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true
Eg:s1 = new String("sony"); //创建的是字符串对象
s1.equals("sony"); //返回
trues1 == "sony" //返回false
//如果
s1 = "sony";
s1 == "sony" //返回true


作者: Changer_s    时间: 2013-5-28 14:04
http://bbs.itheima.com/forum.php ... mp;highlight=equals

http://bbs.itheima.com/forum.php ... mp;highlight=equals
这两个网址可以去看看,都有解释
作者: w270307032    时间: 2013-5-28 14:52
equals 方法是object中的方法,一些类比如String ArrayList等都会覆盖此方法的,方法一旦覆盖他们的实现原来肯定就一样,比较的东西自然就不一样了,所以equals比较的到底是什么东西,你只能去查看这个类中是否覆盖的这个方法,还有它的原代码是如何实现的,比如String类就覆盖了equals方法,比较的是2个字符串的内容是否相同。如果没覆盖,但是你又调用了,那用的就是object中的equals方法。
你也可以自己定义一个类,然后覆盖equals方法,里面写上你认为2个指向型引用或对象,该方法返回值为真的要求。比如你定义了1个person这个类,你可以把equals方法定义为name相同即返回真,或者age相同即返回为真,或者其它情况都行,随你自己便。但是如果2个person用“==”比较,返回的肯定是flase.

而==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true

作者: 紫衣侯    时间: 2013-5-28 18:11
==比的是内存中的地址,其实equals()方法比的也是内存地址,因为equals方法源码内部也是用==实现的,这是object类的equals方法,而平时大家说的equals方法一般只string类的equals方法,它是重写的object类方法,所以可以比较是否相等
作者: 不胖的胖子    时间: 2013-5-28 18:34
== 和 equals 比较运算符
Java中有两种判断两个变量“相等”的方式。

1,==
   使用 == 判断两个变量相等
   参与比较的两个变量时基本类型变量(数值型):只要两个变量的值相等,使用 == 判断
就会返回true
   参与比较的两个变量时引用类型(指向对象):当它们指向同一个对象时, == 判断返回
true。(不在同一继承体系无法比较)。
   重点:== 比较对象的引用时,就是比较对象相等。实际判断的是判断该对象在内存中的
首地址。这是一种绝对相等。

2, equals
   equals方法就是我们所说的“逻辑相等”。什么是逻辑相等?equals方法的方法体内写上
你指定的比较方式,想怎么相等就怎么相等。实际是不能这么干的(想进一步了解如何写
equals方法 可参考 effective java)

看下面代码:(简单粗暴)
  1. public class MyEquals
  2. {
  3.         public static void main(String args[]){
  4.                 Foo firVar = new Foo();
  5.                 Foo secVar = new Foo();

  6.                 String str = new String("!");

  7.                 System.out.println(firVar == secVar);
  8.                 //System.out.println(firVar == str);不可比较的类型:Foo 和 java.lang.String
  9.                 System.out.println(firVar.equals(secVar));
  10.                 System.out.println(firVar.equals(str));
  11.         }
  12. }
  13. class Foo
  14. {
  15.         public boolean equals(Object obj){
  16.          return true;//只要按照我的逻辑,任意对象和Foo对象逻辑上相等
  17.         }
  18. }
复制代码
  1. ---------- 运行java程序 ----------
  2. false
  3. true
  4. true

  5. 输出完成 (耗时 0 秒) - 正常终止
复制代码
从输出结果可以看到。 想用 == 比较没有继承关系的 Foo对象和String对象,直接报错。
用equals这个逻辑相等的方法。什么对象都可以“相等”。但是这样显然没有任何意义。

写在后面的
参考书目 effective java ————>怎样改写equals方法
             疯狂java讲义—————> == 和 equals 的比较
在集合框架中的HashSet集合 会详细讲到 equals 方法 和 hashCode 方法的覆盖







作者: 袁梦希    时间: 2013-5-29 17:04
如果问题已经解决,请把帖子的类型改为已经解决,如果不会解决请看我的个性签名。
作者: 张林敏    时间: 2013-5-30 13:27
本帖最后由 张林敏 于 2013-5-30 13:31 编辑

看了,各种解释后,感觉自己越来越迷糊了

可能可以这样理解,== 比较的是这个变量存在值栈的值,equals 比较的是取出值栈的值,然后找出在堆中的值进行判断
作者: beat_heart    时间: 2014-2-26 16:40
==就是判断等号两边值是否相等,euqals是判断两边字符串是否相同




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2