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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Xiacker 中级黑马   /  2013-12-10 22:59  /  1847 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对于引用类型的比较,==比较的是两个对象的内存地址,这个好说,纠结的equals,本来以为比较的对象的内容,后来看到说这个说法错误,因为看object内equals的源代码中的比较就是用的==,一个类如果没有定义equals方法,它将默认继承Object中的equals方法,返回值与==方法相同。这又郁闷了,
随便搞两个对象比较下,比如String str1=new String("hello");String str2=new String("hello");
str1==str2,返回false,str1.equals(str2).返回true,请大神详解下这个东东??

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

9 个回复

倒序浏览
一个是比较字符串里的内容一个是比较内存地址,所以一个对一个错啊,没什么疑问吧
回复 使用道具 举报
str1==str2这个比较的是他们的内存首地址值,所以结果为false
str1.equals(str2)结果为true,原因是:String类中也有equals方法,它将Object中的equals方法进行了复写,具备了String类自身特点的比较方法
即:Object内的equals方法比较的是内存首地址值,而String内的equals方法比较的是存储内容

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 高亮亮 于 2013-12-10 23:25 编辑

你说的是比较引用类数据。先看==:是比较他们两个对象所指向的堆内存中的地址值,他们是两个不同的对象,结果当然不同啊。然后看equals:这是用来比较他们两堆内存开辟空间后里面存储的数据(这里就是“hello”)是否相同,当然,两个是相同的字符串,是相同的。

再说你说的equals里面用的比较也是==,这是当然啦,就比如哦说在第二部里面看equals比较的时候,他要判断str1“hello”和str2“hello”是否是相等,当然就是用==来判断啊。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
楼上两位说的已经非常对啦,String str1=new String("hello");String str2=new String("hello");
str1==str2,返回false,str1.equals(str2).返回true,很简单解释,==比较的是两个对象的地址,因为两个对象重新new啦,所以返回false,
equals返回true是因为String类中重写啦Object的equals方法,重写的equals比较的是两个对象的值。详细可以参阅老毕String那部分的视频,或者查阅java.lang包中String的API。
希望能帮到你

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
String 类,内部的 equal() 已经复写了 Object 中的 equal() 了,所以不再比较地址值了。
回复 使用道具 举报
剑魂 中级黑马 2013-12-11 00:13:07
7#
当对象用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 进行用equals比较,在没有覆写Object中equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,而String复写了equals方法,是比较内容的

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
11、"=="和equals方法究竟有什么区别?

    (单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚)

     ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

     如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量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方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

这种问题多百度,不要动不动就论坛提问。降低黑马论坛的整体水平!!!

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
icyyaww 中级黑马 2013-12-11 02:23:56
9#
String str1=new String("hello");String str2=new String("hello") 在内存中创建了两个地址,用==比较的是两个地址。当然结果是false,而equals比较的是地址内存放的字符串“hello”,结果当然为true。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 笑脸不在 于 2013-12-13 18:07 编辑

==和equals的区别详解:
1、String s1=new String("hello"):加载String类,在堆内存创建一个String 类型的对象,并将对象的地址值赋值给s1
      String s1=new String("hello"):在堆内存再创建一个String 类型的对象,并将新对象地址值赋值给s2
      显然两个地址值不一样,所以s1==s2的值就是false了
2、Object是所有类的父类,Object中有一个equals(Object obj)方法判断两个Object对象是否相等;
      String类中也有equals(Object obj)方法(覆盖了父类Object的equals方法):
         API说明:将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
       也就是说String类中的equals是比较两个对象的内容是否相同的
       因此 s1.equals(s2)的返回值是ture
3、Object类中的equals()方法的API说明:
      对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)
     也就是说Object类中的equals方法的返回值==比较运算符的结果是一致的,他们比较的都是地址值
代码:
public class EqualsDemo
{
       public static void main(String[] args)
       {
                        Object s1=new Object();
                        Object s2=new Object();
                        System.out.println(s1.equals(s2));         
       }
}

        这段代码的结果也是false的所以:当引用equals方法的对象所属的类对equals方法没有覆盖时:equals方法和==是等价的

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

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