黑马程序员技术交流社区

标题: equals和== [打印本页]

作者: 王毛毛    时间: 2011-9-16 17:38
标题: equals和==
==号,他比较的是一个对象在内存中的地址值,例如
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。
如果没有重写方法,那么他和==号等价吗?能举个例子吗?谢谢
作者: 匿名    时间: 2011-9-16 17:55
能说清楚一点么?重写方法那里不太明白。
作者: 匿名    时间: 2011-9-17 09:02
当内存中只有一个对象进行比较的时候,用==更显水平,多个对象存在时用equals。
在张老师Java高新技术里面提到过,具体哪一集我不记得了。LZ回去翻一下吧
作者: 匿名    时间: 2011-9-17 09:44
==和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)。
作者: 724681149    时间: 2011-10-15 01:57
匿名者 发表于 2011-9-17 09:02
当内存中只有一个对象进行比较的时候,用==更显水平,多个对象存在时用equals。
在张老师Java高新技术里面 ...

张老师那里比较的.class的字节码文件。
作者: 刘江华    时间: 2011-10-15 21:06
通俗点的讲吧,==就是比较两个对象的在内存中的地址是否是同一个地址。例如:String str1="abc"; String str2 = str1;那么str1==str2 为 true.它们指向的就是同一个地址。而equals 是比较两个对象的内容。
作者: 张奇云    时间: 2011-10-17 18:33
若想对比两个对象的实际内容是否相同,必须使用所有对象都适用的特殊方法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
本帖最后由 贾双涛 于 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,让它来比较对象的内容,那么比较的就是对象的内容。




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