黑马程序员技术交流社区

标题: Equals方法和==的区别 [打印本页]

作者: 许正龙    时间: 2013-3-25 17:43
标题: Equals方法和==的区别
如题,他们存在什么区别?
作者: 丘凤光    时间: 2013-3-25 18:02
两者大体上是一样的,
但用equals有一点需要注意,A.equals(B);最好把常量放前面,这样能防止空指针异常,
即当A为空而不是常量时会抛出异常
作者: 胡志超    时间: 2013-3-25 18:19
Equals方法比较的是内容,==比较的是地址
作者: 胡志超    时间: 2013-3-25 18:19
Equals方法比较的是内容,==比较的是地址
作者: 邓建军    时间: 2013-3-25 20:23
"==" : 操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
  "equals" : 操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样,因此在string中equals比较的也是值,而不是地址。
作者: 曾玉锋    时间: 2013-3-25 21:52
对于值类型和string类型来说,==与equals()结果是一样的,只要值相等,则结果为true;否则为false;
对于其他除string类型外的引用类型的对象比较,==返回false;如果该类型重写了equals方法,则看重写后的equals方法具体实现。

作者: 谢辉林    时间: 2013-3-26 01:12
java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

作者: 许正龙    时间: 2013-3-26 09:03
胡志超 发表于 2013-3-25 18:19
Equals方法比较的是内容,==比较的是地址

那么有一个有这么一段代码,
string str1=“abcdef”;  
string str2="abcd";
string str3="ef";
string str4=str2+str3;
如果是比较地址的话那么str1==str4;运行结果是为false,但是在程序中判断他们是相等的,为true,这么的话就不是比较地址了。
作者: 胡志超    时间: 2013-3-26 09:18
你错了,在内存中有一个字符串池,当你申明一个字符串时,它会先在字符串池中找,如果找到就直接用,如果找不到就重新自己创建,因为你之前申明str4的时候,最后赋值为“abcdef”,但是这时str1已经为“abcdef”在字符串池中已经存在,所以str4会直接指向字符串池中的“abcdef”。也就是说str1和str4指向的是同一块内存空间,所以它们的地址是相同的
作者: 胡志超    时间: 2013-3-26 09:18
许正龙 发表于 2013-3-26 09:03
那么有一个有这么一段代码,
string str1=“abcdef”;  
string str2="abcd";


你错了,在内存中有一个字符串池,当你申明一个字符串时,它会先在字符串池中找,如果找到就直接用,如果找不到就重新自己创建,因为你之前申明str4的时候,最后赋值为“abcdef”,但是这时str1已经为“abcdef”在字符串池中已经存在,所以str4会直接指向字符串池中的“abcdef”。也就是说str1和str4指向的是同一块内存空间,所以它们的地址是相同的
作者: 许正龙    时间: 2013-3-26 09:31
胡志超 发表于 2013-3-26 09:18
你错了,在内存中有一个字符串池,当你申明一个字符串时,它会先在字符串池中找,如果找到就直接用,如 ...

这个我在程序中看过str1和str4的地址,他们是不一样的!
作者: 胡志超    时间: 2013-3-26 09:45
许正龙 发表于 2013-3-26 09:31
这个我在程序中看过str1和str4的地址,他们是不一样的!

怎么会,你是不是看错了
作者: 许正龙    时间: 2013-3-26 10:09
胡志超 发表于 2013-3-26 09:45
怎么会,你是不是看错了

看看这个结果!

未命名.jpg (29.66 KB, 下载次数: 15)

未命名.jpg

作者: 严夫    时间: 2013-4-8 11:23
==比较的是两个变量的地址,equals比较的是值
作者: 黑马田杰    时间: 2013-4-8 16:38
本帖最后由 黑马田杰 于 2013-4-8 16:40 编辑

通过反编译发现:
Equals()最终也是调用"==",
只不过Equals()对变量做了判断,如果为null就抛异常

Equals.png (6.46 KB, 下载次数: 16)

Equals.png

Equals2.png (3.27 KB, 下载次数: 13)

Equals2.png





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