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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王毛毛 黑马帝   /  2011-9-16 17:38  /  2546 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

==号,他比较的是一个对象在内存中的地址值,例如
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。
如果没有重写方法,那么他和==号等价吗?能举个例子吗?谢谢

评分

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

查看全部评分

8 个回复

倒序浏览
黑马网友  发表于 2011-9-16 17:55:46
沙发
能说清楚一点么?重写方法那里不太明白。
回复 使用道具 举报
黑马网友  发表于 2011-9-17 09:02:56
藤椅
当内存中只有一个对象进行比较的时候,用==更显水平,多个对象存在时用equals。
在张老师Java高新技术里面提到过,具体哪一集我不记得了。LZ回去翻一下吧
回复 使用道具 举报
黑马网友  发表于 2011-9-17 09:44:17
板凳
==和equals是不等价的
指示其他某个对象是否与此对象“相等”。
对于字符串的创建比较特殊,因为字符串还有一个字符串池的概念:
String str1="abc";
String str2="abc";
System.out.println(str1==str2);//此时会返回true
另外一种写法是:
String str1=new String("abc");
String str2=new String("abc");
System.out.println(str1==str2);//此时会返回false
这就是字符串池的知识了,如果是原始类型的话,其实用==和用equals基本上都等得到同样的结果,
建议判断两个引用类型的话,最好用equals方法。
equals 方法在非空对象引用上实现相等关系: (以下是equals方法在javaSE中的原话)

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

评分

参与人数 1技术分 +2 收起 理由
admin + 2 说得不错!

查看全部评分

回复 使用道具 举报
匿名者 发表于 2011-9-17 09:02
当内存中只有一个对象进行比较的时候,用==更显水平,多个对象存在时用equals。
在张老师Java高新技术里面 ...

张老师那里比较的.class的字节码文件。

评分

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

查看全部评分

回复 使用道具 举报
通俗点的讲吧,==就是比较两个对象的在内存中的地址是否是同一个地址。例如:String str1="abc"; String str2 = str1;那么str1==str2 为 true.它们指向的就是同一个地址。而equals 是比较两个对象的内容。

评分

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

查看全部评分

回复 使用道具 举报
张奇云 黑马帝 2011-10-17 18:33:35
7#
若想对比两个对象的实际内容是否相同,必须使用所有对象都适用的特殊方法equals()。但这个方法不适用于“主类型”,那些类型直接使用==和!=即可。
举例:
  1. public class EqualsMethod {
  2. public static void main(String[] args) {
  3. Integer n1 = new Integer(1);
  4. Integer n2 = new Integer(1);
  5. System.out.println(n1.equals(n2));
  6. System.out.println(n1==n2);
  7. }
  8. }
复制代码
输出结果:
true
false
回复 使用道具 举报
贾双涛 黑马帝 2011-10-17 23:32:48
8#
本帖最后由 贾双涛 于 2011-10-17 23:34 编辑

Object类中的equals默认的与“==”是等价的
“对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 ”--引自jdk帮助文档
我们平时说的equals比较的是对象的内容,其实并不是绝对的,那是因为那个类中重写了Object类中的equals方法,而在那个方法中比较的是对象中的内容,比如我们比较熟悉的String类型的比较,我们说str1.equals(str2)比较的是对象中的内容,本质上是因为String类中重写了Object类中的equals方法。
而对于我们自己写的类,进行比较的时候如果直接调用equals进行比较,我们使用的还是从Object类中继承的equals,所以还是相当于“==”,我们想让我们的equals比较内容,怎么办?重写equals方法喽。
总结:
如果没有重写Object类中的equals,比较的是“==”;
如果重写了Object类中的equals,让它来比较对象的内容,那么比较的就是对象的内容。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马