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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张治国 中级黑马   /  2014-4-3 08:42  /  1511 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张治国 于 2014-4-6 09:32 编辑

“==”和 equals方法究竟有什么不同啊,再看黑马视频时,也没太详细的讲解,查的资料都太‘官方’了。始终不能灵活运用?究竟在什么地方用equals或“==”
在这里表示感谢!!!!!

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 1453149997 于 2014-4-3 08:53 编辑

(1)==比较对象的哈希值,即对象的地址,而equals比较对象是否相等;
在Object中,equals和==的作用是相同的,即equals里使用的就是==;
所有的自定义类都会间接或直接的继承equals,如果是直接继承,即你定义类的时候没有使用extends继承其他类,那么你将继承Object的equals方法,如果我们需要自定义比较规则,比如定义了一个Person,要在name和age相等的情况下算作是一个人,那么就要覆写equals
(2)我们如果仅仅要比较对象的地址或者哈希值是否相等,那么使用==,但是哈希值相等不一定是同一对象,所以想要比较是否是同一对象要使用equals

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报 1 0
1。 ==是比较运算符,是用来比较两个数或者字母是否相同
2。equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等,区分大小写。
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
== 比较在内存中所指向的引用地址是否相等   equals 比较两个内容是否相等

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
“==”比较基本数据类型,还可以比较引用数据类型的地址值是否相等
Object类中“equal()”                    只能 比较引用数据类型的地址值是否相等
String类中重写了 “equal()”方法赋予了equal新的含义     比较2个String对象的内容是否相等
回复 使用道具 举报



解释一下==号,他比较的是一个对象在内存中的地址值,比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。堆和栈明白吗?堆中是new的String对象,就是那两个“str”。栈中是刚才new 的两个String对象所在的地址,该地址存放于栈中。用==比较,结果比较的就是栈中两个“str”的位置是否相同,也就是比较栈中的内容,代码中就S1 ,S2 的内容。
equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。在Object类源码中是这样写的。
  1. <p>public boolean equals(Object obj)</p><p> { </p><p>return (this == obj);</p><p>  }</p>
复制代码
他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。
  1. <p>public boolean equals(Object anObject)</p><p> {</p><p> if (this == anObject)</p><p>    {    </p><p>      return true; </p><p>    } </p><p>  if (anObject instanceof String)</p><p> {    </p><p>          String anotherString = (String)anObject;</p><p>           int n = count; </p><p>           if (n == anotherString.count)</p><p>        { </p><p>             char v1[] = value;  </p><p>             char v2[] = anotherString.value; </p><p>              int i = offset; </p><p>              int j = anotherString.offset; </p><p>             while (n-- != 0)</p><p>                                {     </p><p>                                 if (v1[i++] != v2[j++])  </p><p>                                  return false; </p><p>                                }</p><p>                               return true;   </p><p>           }</p><p>  } </p><p>return false; </p><p>}</p>
复制代码
String里的方法,如果==号比较不相等,还会进行一下值的比较。这也就是说,equals()方法,不但执行了==比较,这一步比较的是栈的内容,也进行了堆内存中对象“str”的内容比较,比较的是堆内存的东西。
所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价。
注意区分栈内存和堆内存。明白==的比较原理,估计你就明白了。













































































评分

参与人数 1技术分 +2 收起 理由
朱神必 + 2

查看全部评分

回复 使用道具 举报
==是判断两个对象是否相等,equals是判断两个对象的值是否相等。
回复 使用道具 举报
equals是内容比较。比如张三和李四的年龄做比较。this.name.equals(p.name);
回复 使用道具 举报
很简单啊==比较对象,equals比较内容
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马