黑马程序员技术交流社区

标题: “==”和equals的区别 [打印本页]

作者: 阴有风    时间: 2014-9-29 08:20
标题: “==”和equals的区别
equals是比较两个对象的值是否相等,而==比较这两个是否是同一对象;比如
String s1=new String("abc");
String s2=new String("abc");
此时s1.equals(s2),因为他们的值相同所以true;
而s1==s2,他们两个不是同一个对象,所以为false;
而=则是赋值的意思如果s1=s2,是将s2付给s1,这时他们指的都是s2这个对象,所以此时s1==s2为true

作者: ζ_____________    时间: 2014-9-29 09:54
本帖最后由 ζ_____________ 于 2014-9-29 17:28 编辑

对于"Fightin黑马"同学的误解以及自己的错误深表歉意...现已将原帖修  对于自己的错误道声对不起.


EG:
String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc";

System.out.println(str1.equals(str2)); //true;
System.out.println(str1==str2);//false;
System.out.println(str1==str2);//true;

s1在内存中有一个对象;s2在内存中有两个对象.
但是String类中的euqlas()在String类中复写了,这里的equals比较的是两个字符串中的内容是否相等.
s1指向一个字符串对象,s3指向一个字符串对象.因为这个"abc"的字符串对象已经在内存中存在了,
作为字符串这样特殊的对象,在常量池中存在的数据,s3在重组的时候发现"abc"已经在常量池中存在,他就不会再独立开辟空间了.
因为再开辟空间的时候,会发现比较浪费空间."abc"已经存在已经不能被改变,就没有必要再开辟空间来给它分配了.
为了节约内存,在String这个对象当中,只要内容相同的话. s1 和 s3都代表着同一个对象.


这样理解完之后可能对你怎样复写 集合类中的  equals方法会有些帮助的^^



作者: Fightin黑马    时间: 2014-9-29 10:30
本帖最后由 Fightin黑马 于 2014-9-29 10:33 编辑

==可以判断基本数据类型是否相等,也可以判断两个引用数据类型.但是equals只能用来比较两个引用数据类型,关于equals楼上讲的很清楚了,==对于引用数据类型是比较的地址值是否为同一个地址值.
String s1=new String("abc");
String s2=new String("abc");
s1和s2都是new出来的对象,直接用==比较是比较地址值,这两个地址值是不同的,所以s1==s2是false.


作者: ζ_____________    时间: 2014-9-29 10:58
本帖最后由 ζ_____________ 于 2014-9-29 17:09 编辑
Fightin黑马 发表于 2014-9-29 10:30
==可以判断基本数据类型是否相等,也可以判断两个引用数据类型.但是equals只能用来比较两个引用数据类型,关 ...
                     
作者: Fightin黑马    时间: 2014-9-29 11:28
本帖最后由 Fightin黑马 于 2014-9-29 11:29 编辑
ζ_____________ 发表于 2014-9-29 10:58
亲 ,你这里错了.  声明的类型是String 啊!  如果是其他类型的话这样判断是没问题的.   关键是String 它特 ...

即使是String类型的两个都是new出来的地址值是不一样的,它特有的机制是针对equals方法并不会针对==,你自己做下测试
作者: 阴有风    时间: 2014-9-29 11:50
Fightin黑马 发表于 2014-9-29 11:28
即使是String类型的两个都是new出来的地址值是不一样的,它特有的机制是针对equals方法并不会针对==,你自己 ...

好吧谢谢各位
作者: 阴有风    时间: 2014-9-29 11:53
知道了,谢谢各位
作者: ζ_____________    时间: 2014-9-29 11:59
Fightin黑马 发表于 2014-9-29 11:28
即使是String类型的两个都是new出来的地址值是不一样的,它特有的机制是针对equals方法并不会针对==,你自己 ...

这不是equals方法的问题,这是String的机制.





作者: wy363681759    时间: 2014-9-29 12:17
这个问题已经处理太多次了   看看以前的贴吧
作者: 沙拉很好吃    时间: 2014-9-29 12:54
感觉一个是比较数字时候用的,一个是比较字符串的时候用的吧
作者: daoqin    时间: 2014-9-29 15:20
String s1 = new String("hello");
String s2 = new String("hello");
syso(s1.equals(s2));
答案是true,大家会觉得equals就是比较内容是否相同的,但是如果是下面的代码呢?
StringBuffer sb1 = new StringBuffer("hh");
StringBuffer sb2= new StringBuffer("hh");
syso(sb1.equals(sb2));
你可以去运行,这个答案是false,很奇怪吧,其实equlas是Object类的方法,但是object.equals()方法不仅比内容是否相同,还会去比较地址是否相同,
但是String类重写了equals方法,而StringBuffer没有重写这个方法。所以就会有不同的结果
作者: FlyFish    时间: 2014-9-29 16:45
不觉明历
作者: Fightin黑马    时间: 2014-9-29 16:50
ζ_____________ 发表于 2014-9-29 11:59
这不是equals方法的问题,这是String的机制.

咱俩讨论的都不是一个地方,好吧
我说的是
String s1=new String("abc");
String s2=new String("abc");
s1==s2   false
你不看仔细看我的回复就讲我错了,兄弟认真点可好?
作者: 张业婷    时间: 2014-9-29 17:00
s1=s2;这是赋值,但是是赋的地址值,也就是一个地址,Sring类重写了Object的equals方法,你可以看看源代码!
作者: 张业婷    时间: 2014-9-29 17:02
s1,s2是有值,但是都是地址值,是java虚拟机给分配的,是不相同的,当然为false了
作者: ζ_____________    时间: 2014-9-29 17:08
本帖最后由 ζ_____________ 于 2014-9-29 17:14 编辑

          
作者: ζ_____________    时间: 2014-9-29 17:14
Fightin黑马 发表于 2014-9-29 16:50
咱俩讨论的都不是一个地方,好吧
我说的是
String s1=new String("abc");

喔喔喔~ 我的错... 对不起啊.

作者: 笑脸迷人    时间: 2014-9-29 17:21
ζ_____________ 发表于 2014-9-29 11:59
这不是equals方法的问题,这是String的机制.

更详细的可以去了解下享元模式
作者: 笑脸迷人    时间: 2014-9-29 17:23
daoqin 发表于 2014-9-29 15:20
String s1 = new String("hello");
String s2 = new String("hello");
syso(s1.equals(s2));

Object类中的equals方法和==是等价的~
它就是比较两个数值是否相等~~~
作者: 阴有风    时间: 2014-10-3 07:33
wy363681759 发表于 2014-9-29 12:17
这个问题已经处理太多次了   看看以前的贴吧

好的吧!怎么结束提问呢,需要在发帖吗




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