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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liugy 中级黑马   /  2014-2-19 22:55  /  1221 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请问一下比较数据的时候,“==”和”equals“的有什么区别,总是不知道什么时候该用哪一个,请高手指导,谢谢

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

7 个回复

倒序浏览
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

“在堆中存储的地址是否相同”和“堆中的内容是否相同”有什么区别???总感觉是一个样的阿。。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
-->“在堆中存储的地址是否相同”和“堆中的内容是否相同”有什么区别???总感觉是一个样的阿。。

堆内存存储的是内容,首地址存放在栈内存中。
所以说,==比较的是地址,equals比较的是内容。
不知道我这样说是否欠妥?

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
值类型是存储在内存中栈里的,而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。  ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。    
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同==比较的是2个对象的地址,而equals比较的是2个对象的内容
之前回复过类似的帖子举个例子:
String s1=new String("abc");
String s2=new String("abc");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
输出的第一个s1==s2是false,而s1.equals(s2)是true。这是为什么呢?
代码中,s1,s2分别是String的两个对象引用,在栈内存中开辟,指向在堆内存中开辟的两个String对象,用十六进制地址值标示,假设s1=0X0012,s2=0x0056,所以是不相等的,所以结果是false,而equals()方法是String类中专门用来比较对象内容即字符串是否相同的方法,两个对象的内容都是"abc",所以结果是true。
在内存中的关系如下图所示:
希望可以帮到楼主你。

QQ截图20140218202123.jpg (100.41 KB, 下载次数: 22)

QQ截图20140218202123.jpg

评分

参与人数 2技术分 +2 黑马币 +2 收起 理由
戒爱 + 2 赞一个!
何伟超 + 2

查看全部评分

回复 使用道具 举报
当new一个新实例的话会分配新的内存空间。当你用==比较时,比较的是所指向内存区域是否一致
当一个类的直接父类是Object,又没重写equals方法,则使用的是Object 类的 equals 方法,实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 equal只有重写后才与==的比较结果不同。

评分

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

查看全部评分

回复 使用道具 举报
疲劳的小马 发表于 2014-2-19 23:28
值类型是存储在内存中栈里的,而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中 ...

感觉了解一些,多谢各位朋友了。
回复 使用道具 举报
ghhryr 中级黑马 2014-2-20 00:22:39
7#
== 表示比较栈内存中的值是否相等,equals 表示的堆内存中的内容是否相等,所以我们编程过程中,首先看比较的两个数是否在同一个内存区域中,不是,肯定为false,是的话,具体分析
回复 使用道具 举报
java中“==”和equals有时候的确不是很好区分。
1、“==”号是比较数据在内存中的存储地址,针对基本数据类型的话,一般都是用“==”来比较,例如:
int a =5,b=7;
if(a==b)

2、如果是对类进行比较,用“==”的情况下,如果比较双方是指向同一个对象(也就是在内存中是同一个地址),这时才为true,否则为false,例如:
Person P1 = new Person("张三",20);
Person P2 = new Person("李四",20);
Person P3 = P1;
这种比较结果就很明了了,P1==P2为false,P1==P3为true,其实不是在比较a和b或者a和c,而是比较他们这个引用所指向的对象是不是同一个(在内存中存储的地址是否相同)。
对String的比较和上面类似。

3、equals的应用主要针对字符串比较多,也可以用于其他类之间的比较。大家比较了解的就是在字符串String上的应用了,String类重写了equals方法,从而在比较的时候只需根据字符串中的值是否相同来判断相不相等。例如:
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
s1==s2为true,s1==s3为flase,s1.equals(s3)为true。

4、"=="和equals在字符串上的区别已经是老生长谈的问题了,说说他们之间的关系,equals方法源自Object这个类,在Object中equals的判断依据也是使用“==”去判断的,只是很多Object的子类都重写了equals方法,从而有了不一样的实现方式。如果一个类没有重写equals方法,那么调用equals的时候,还是去比较它们在内存中的存储位置是否相同。
例如上面的Person
Person P1 = new Person("张三",20);
Person P2 = new Person("张三",20);
在未重写equals方法时,P1.equals(P2)为false的,我们可以重写其equals方法,判断姓名年龄一样时就确定为同一个人,从而让结果为true。

5、很多情况下我们自己定义的类也需要重写equals方法,这时需要注意的一点就是,很多时候是将hashcode方法一同重写,这样会很大程度上提高比较时候的效率。并且在将我们自定义类的对象存入与哈希值相关的集合(HashMap、HashSet)中时,就必须重写hashcode方法。因为这会影响到集合的一些操作,例如add。

评分

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

查看全部评分

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