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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 许正龙 中级黑马   /  2013-3-25 17:43  /  1994 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如题,他们存在什么区别?

14 个回复

倒序浏览
两者大体上是一样的,
但用equals有一点需要注意,A.equals(B);最好把常量放前面,这样能防止空指针异常,
即当A为空而不是常量时会抛出异常

评分

参与人数 1黑马币 +6 收起 理由
苏波 + 6

查看全部评分

回复 使用道具 举报
Equals方法比较的是内容,==比较的是地址

评分

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

查看全部评分

回复 使用道具 举报
Equals方法比较的是内容,==比较的是地址
回复 使用道具 举报
"==" : 操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
  "equals" : 操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样,因此在string中equals比较的也是值,而不是地址。

评分

参与人数 1黑马币 +6 收起 理由
苏波 + 6

查看全部评分

回复 使用道具 举报
对于值类型和string类型来说,==与equals()结果是一样的,只要值相等,则结果为true;否则为false;
对于其他除string类型外的引用类型的对象比较,==返回false;如果该类型重写了equals方法,则看重写后的equals方法具体实现。

评分

参与人数 1黑马币 +6 收起 理由
苏波 + 6

查看全部评分

回复 使用道具 举报
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-25 18:19
Equals方法比较的是内容,==比较的是地址

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


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

这个我在程序中看过str1和str4的地址,他们是不一样的!
回复 使用道具 举报
许正龙 发表于 2013-3-26 09:31
这个我在程序中看过str1和str4的地址,他们是不一样的!

怎么会,你是不是看错了
回复 使用道具 举报
胡志超 发表于 2013-3-26 09:45
怎么会,你是不是看错了

看看这个结果!

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

未命名.jpg
回复 使用道具 举报
==比较的是两个变量的地址,equals比较的是值
回复 使用道具 举报
本帖最后由 黑马田杰 于 2013-4-8 16:40 编辑

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

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

Equals.png

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

Equals2.png
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马