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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 文涛 中级黑马   /  2013-11-6 11:49  /  1549 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 文涛 于 2013-11-6 16:17 编辑

请问下大家,String s1="abc";String s2="abc";
s1==s2;
s1.equals(s2);
我知道equals是true,但是为什么==是false呢,我一直没有理解到,还有就是Object的原始的equals方法是比较对象的什么

评分

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

查看全部评分

11 个回复

倒序浏览
为什么我比较s1==s2时  是true
回复 使用道具 举报


从String s1="abc";String s2="abc";中可以看到,这两个String变量“=”两边的值都是一样的,因为“==”比较的是这两个变量的堆内存引用地址,s1和s2是两个不同的变量,内存地址肯定也不同,所以结果是false。

在s1.equals(s2);中使用equals()方法,比较的是变量的内容。因为s1和s2这两个变量的值都是"abc",内容一致,所以结果就是true。


点评

s1和s2是一个变量好不好、、、、内存地址也是一样的 楼主说是false肯定是没用代码试过的  发表于 2013-11-6 12:56
回复 使用道具 举报
这么给你说吧,“==”比较的是两个字符串的内存地址值,equals比较的是字符串的内容,只有当s1=temp=s2时,“==”就是ture
回复 使用道具 举报
ヅ飞飞 来自手机 中级黑马 2013-11-6 12:51:22
报纸
本帖最后由 ヅ飞飞 于 2013-11-6 13:06 编辑

两个结果都是true。
其实==和equals的事很简单,只要记得两点:
1、==两边如果是对象比较的是两个对象的引用。
2、equals比较两对象的方式是调用前者的equals方法。
其实==和equals他俩是两码事儿,没什么太大关系,一个是运算符一个是方法,唯一的联系就是Object类的equals方法默认使用的==来比较两个对象这样写其实意义不大这个equals方法是子类来覆写的。
String类果断覆写了equals方法,其比较的是两字符串的内容。
注:String类有两种初始化方法1、String s = new String("abc"); 2\ String s = "abc"; 当使用第二种方式时要注意:abc字符串并没有封装成字符串,而是存在于字符串常量池中,如果再初始化一个字符串String s2 = "abc"; s2引用指向的位置和s1相同都是常量池中的"abc";所以s1==s2 为真。如果当使用第一种初始化方式时结果一定是假。

评分

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

查看全部评分

回复 使用道具 举报 3 0
两个都是true
如果这样  s1==s2就是false了   String s1 = "abc"; String s2 = new String("abc");
这样 由于s1是一个字符串而s2是一个对象  所以s1==s2是false  而equal比较就是true
回复 使用道具 举报
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = newObject();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条new语句创建了两个对象,然后用a/b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

另外,你说的s1==s2;是false?,这不可能,因为当你用String s1="abc";String s2="abc"; 这种方式建立对象时候,系统会去在内存中找内容是否有一样的,如果一样,就不会新开辟空间,你两个引用都是指向的abc。

评分

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

查看全部评分

回复 使用道具 举报
==在内存里面比较的是两个引用的的地址是否相同,而不是直接比较数值是否相同,而equls是Object的方法,比如说System.out.println(s1.equals(s2));  是s1去调用equls()方法,把s2输入到里面,进而s1和s2进行比较,实际上比较的还是s1和s2的地址值是否相同。
回复 使用道具 举报
看看是不是代码出现了书写的问题啊,应该都为true啊
回复 使用道具 举报
本帖最后由 唐宋元明清 于 2013-11-6 16:08 编辑

String s1="abc";String s2="abc";  //s1和s2都是引用的 堆内存String常量池中的对象"abc"的地址。
s1==s2;  //==永远比较的是内存中的地址,s1和s2的地址 ,指向的都是一个地址所以比较结果为true
s1.equals(s2); //Object中原始的equals的语法:public boolean equals(Object obj){this==obj} 比较的是对象的引用地址值,String中equals重写为比较内容和地址值(内容相同为true,地址相同也为true)。

评分

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

查看全部评分

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