黑马程序员技术交流社区

标题: 关于Object类中的equals和==的区别 [打印本页]

作者: 张振纲    时间: 2012-8-6 13:10
标题: 关于Object类中的equals和==的区别
我们都知道,Object 类中的equals 比较的是两个对象的地址值
而且这个方法会随着不同对象的建立被复写而拥有新的比较方法,或者说新的判断是否相同的方法

那么==到底是根据什么判断,会不会改变?
作者: hello world    时间: 2012-8-6 13:16
==就是等于号  判断两个地址,地址是十六进制,就是在判断两个十六进制的int值  是否相等  和你判断1==1;
0x12==0x12一样,明白了嘛。
作者: 张振纲    时间: 2012-8-6 13:24
刘向阳 发表于 2012-8-6 13:16
==就是等于号  判断两个地址,地址是十六进制,就是在判断两个十六进制的int值  是否相等  和你判断1==1;
...

意思如果我有两个同类对象 == 判断的也是地址值?
作者: 范泰洋    时间: 2012-8-6 13:25
譬如:a=3,b=3; 这两个3的地址是不一样的,但是用输出语句打印出a==b返回的是ture。
这就说明了在基本数据类型中不是比较地址的,而是比较的应该是数值。还有就是那个数值是常量,是不会改变的。
作者: 张淦    时间: 2012-8-6 13:29
==是在判断两个对象时,是判断两个对象的地址值,因为它是个比较运算符,所以不会改变。
equals则不同,它在Object类中是比较两个对象的地址值的方法,和==号的作用一样,但是在实际操作中,它会被复写而改变了它本身判断的方式。
如:String s1="abc";
      String s2=new String("abc");
      System.out.println(s1==s2);
      System.out.println(s1.equals(s2));
前者为false,后者为true,这就是因为在String类中复写了Object类中的equals方法,使得判断不是依据地址值,而是比较其内容。
希望我的回答对你有帮助!

作者: 张振纲    时间: 2012-8-6 13:31
张淦 发表于 2012-8-6 13:29
==是在判断两个对象时,是判断两个对象的地址值,因为它是个比较运算符,所以不会改变。
equals则不同,它 ...

我还是觉得你比较靠谱
多问一个问题

==是比较运算符  我这么说对不对
当它比较两个数据时,比如int double等是比较的数值
而当它比较两个对象时,比较的则是地址值

顺便再问一个问题
地址值和哈希值一样吗?
作者: hello world    时间: 2012-8-6 13:35
张振纲 发表于 2012-8-6 13:24
意思如果我有两个同类对象 == 判断的也是地址值?

是判断地址值,但你new 的本类对象的地址值不一样而已
作者: 马州州    时间: 2012-8-6 13:35
本帖最后由 马州州 于 2012-8-6 13:38 编辑

我给你回答吧,嘿嘿
前几天刚看的

Java中的equals方法和==运算值类型是存储在内存中的堆栈,而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
         equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

==比较的是2个对象的地址,而equals比较的是2个对象的内容。

当equals为true时,==不一定为true;
String中的equals和==

public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = "Monday";
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
}
}

编译并运行程序,输出:s1 == s2
说明:s1 与 s2 引用同一个 String 对象 -- "Monday"!

2.
再稍微改动一下程序,会有更奇怪的发现:
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
if (s1.equals(s2))
System.out.println("s1 equals s2");
else
System.out.println("s1 not equals s2");
}
}
我们将 s2 用 new 操作符创建
程序输出:
s1 != s2
s1 equals s2
说明:s1 s2分别引用了两个"Monday"String对象

前两天看的,整理了一下




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