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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张君 中级黑马   /  2013-3-18 18:51  /  2382 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 猫腻 于 2013-3-18 20:52 编辑

equals ();方法 和 == 比较 分别在那种情况下 使用以及它们得得区别?:) 新人求关照、

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

10 个回复

倒序浏览
  1. 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
  2. ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
  3. equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。  
  4. ==比较的是2个对象的地址,而equals比较的是2个对象的内容。 显然,当equals为true时,==不一定为true; 一、String中的equals和== 1、
  5. public class TestString {
  6.      public static void main(String[] args) {          String s1 = "Monday";          String s2 = "Monday";      } }
  7. 上面这段程序中,到底有几个对象呢? 来检测一下吧,稍微改动一下程序
  8. public class TestString {
  9.      public static void main(String[] args) {          String s1 = "Monday";          String s2 = "Monday";          if (s1 == s2)
  10.              System.out.println("s1 == s2");          else
  11.              System.out.println("s1 != s2");      } }  
  12. 编译并运行程序,输出:s1 == s2
  13. 说明:s1 与 s2 引用同一个 String 对象 -- "Monday"!  2.
  14. 再稍微改动一下程序,会有更奇怪的发现:
  15. public class TestString {
  16.      public static void main(String[] args) {          String s1 = "Monday";
  17.          String s2 = new String("Monday");          if (s1 == s2)
  18.              System.out.println("s1 == s2");          else
  19.              System.out.println("s1 != s2");          if (s1.equals(s2))
复制代码

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
== 比较的是两个对象的地址相等。说白了就是比较的两个引用是否指向同一个对象。equals ()方法,是从Object 中继承的方法,它默认比较的也是两个对象的地址。
也就说Object 中 equals()跟 == 是等效的,都是比较两者的对象地址,即两者是否是同一对象。但是 在我们的应用中,我需要比较的不是两者,是否为同一对象,而是两者
是否等效,即内容是否相等。这就需要重写equas 方法,改变Object 中的默认实现,由比较地址,改为比较内容。例如 String 等,都已经重写了equals()方法。说白了==比较
的用永远是地址,即两者是否为同一对象。经过重写的equals() 一般比较的是内容,即两个对象是否等效。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
==”操作符专门用于比较两个变量的值是否相等,
也就是用于比较变量所对应的内存中所存储的数值是否相同,
要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

equals”方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,
它比较的两个对象是独立的。


参考:http://bbs.itheima.com/thread-40672-1-1.html

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
==是比较地址,但是Object类中定义的equals方法它就是使用==实现的,也是比较地址,只有我们重写equals方法后,它才是比较内容。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
equals是比较对象中的内容 例如字符串和字符串的比较,如果你用==比较字符串,那时比较内存地址,而不是比字符串内容!

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
==   比较的是两个值在内存中存储的地址
equals比较的是两个对象里的内容是否相等
equals为true时,==不一定为true

==可用于基本类型和引用类型
比如
int a=10;
int b=10;
用==相比为true;
==用于基本类型相比,比较的是两个变量的值是否相等
String   a=new   String( "foo ");
String   b=new   String( "foo ");
虽然第二个结果一样,但是是两个不同的对象,他们的内存地址不同,而==在引用类型比较的是
内存地址,所以为false
虽然是两个对象,但是他们的内容一样,用equals相比会得到true;

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
==:在基本数据类型中,比较的是变量的实际值
        在引用数据类型中,比较的是引用类型的地址值

equals():在Object类中比较的是引用类型的地址值

有些类会重写Object的 equals()方法。比如String类(可以参照jdk API文档。),重写之后比较的就是实际值了。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
1.==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同;当用于引用类型的时候,是比较对象是否相同。
2.基本类型没有equals方法,equals只比较值(对象中的内容)是否相同(相同返回true)。
3.一个类如果没有定义equals方法,它将默认继承Object中的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逻辑是如何实现的。
回复 使用道具 举报
郭利超 发表于 2013-3-18 19:01

:) 说的很清晰。感谢哥么。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马