黑马程序员技术交流社区
标题:
"=="和equals方法究竟有什么区别
[打印本页]
作者:
nihaoshitou
时间:
2013-5-11 10:23
标题:
"=="和equals方法究竟有什么区别
求大神指点粤详细越好!谢了!
作者:
Jacky_Chen1990
时间:
2013-5-11 10:25
我是来看头像的。
作者:
Friendy89
时间:
2013-5-11 10:29
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如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方法
作者:
fjl_fight
时间:
2013-5-11 10:36
本帖最后由 fjl_fight 于 2013-5-11 11:04 编辑
==是用于数值(基本数据类型)比较和地址比较
equals是用于比较内容,跟地址没关系
String str1="abc";
String str2="abc";
String str3="ab";
str3=str1;
String str4=new String("abc");
String str5=new String("abc");
System.out.println(str1==str2);//true
System.out.println(str1==str3);//true
System.out.println(str2==str3);//true
System.out.println(str1==str4);//false
System.out.println(str2==str4);//false
System.out.println(str3==str4);//false
System.out.println(str5==str4);//false
System.out.println("******************************");
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//true
System.out.println(str2.equals(str3));//true
System.out.println(str1.equals(str4));//true
System.out.println(str2.equals(str4));//true
System.out.println(str3.equals(str4));//true
System.out.println(str5.equals(str4));//true
复制代码
上述代码的内存解析,用new实例化的都会在堆中开辟新的空间
2013-05-11_105726.jpg
(40.07 KB, 下载次数: 0)
下载附件
2013-5-11 10:59 上传
作者:
chouwayメ
时间:
2013-5-11 10:53
本帖最后由 chouwayメ 于 2013-10-8 22:42 编辑
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。 equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
总的说:java中equals和==的区别 ==比较的是2个对象的地址,而equals比较的是2个对象的内容
而对于
String a=new String("abc");String b={"abc"};
System.out.println("a=b?:"+a==b);
System.out.println("a equals b?:"+a.equals(b));
则结果是:第一个false,第二个是true.
因为这里涉及到一个String对象因创建方式的不同而采取存储的方式不同。详细参见
http://bbs.itheima.com/thread-48732-1-1.html
作者:
long
时间:
2013-5-11 10:55
==操作符用于基本数据类型时比较的是数值是否相等,用于引用数据类型时比较的是引用(测试两个引用是否指向同一个对象)。
equals方法先在上帝类中定义,用于比较两个对象的哈希地址值是否相等,该方法不能用于基本数据类型,因为它们不是对象。如果需要用equals方法比较两个对象的内容是否相等,则要在对象所属的类中复写equals方法,以实现你想比较的内容。
作者:
rosv
时间:
2013-5-11 11:13
在没有重写Object类中的equals方法时,所有对象比较的都是地址,看看Object类中equals的源码
public boolean equals(Object obj) {
return (this == obj);
}
没有重写Object类中的equals方法,两对象比较时和==没有区别,不过==用的更广泛,它可以比较基本类型,二equals只能比较对象,注意基本类型的包装类重写了Object的
equals方法,你也可以自定义equals的比较规则,只要重写Object的equals方法就可以了。。。
作者:
李瑞
时间:
2013-5-11 11:19
对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。“==”比较两个变量本身的值,即两个对象在内存中的首地址。
对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
如果是基本类型比较,那么只能用==来比较,不能用equals
对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的
作者:
刘学明
时间:
2013-5-11 11:37
其实这个问题问的人已经很多了 论坛中这个问题的贴子也很多了
我说最简单好理解了
1.== 可以用来比较
基本数据类型 和 引用数据类型(对象)
当==比较 基本数据类型时 比较的是他们的值是否相等。 相等为true 不相等为flase;
当==比较 引用数据类型时 比较的是他们的对象在堆内存的首地址, 相同为true 不相同为flase;
2.equals 不可以用来比较基本数据类型,
用来比较引用数据类型(对象)。
其实equals在没有复写的情况下和==是等价的(equals是Object的方法),都是比较的他们的对象在堆内存的首地址。
可以自定义比较方式来复写equals 比如String类在用equals比较时就是比较的他们对象的值是否相等,因为String类中的equals方法被java本身复写了
作者:
江大海
时间:
2013-5-11 15:36
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
就好像说人的长相,==比较的是两个人的长相是否一样,而equals比较的是两个人是否是同一个人,
作者:
黑马-雷钊
时间:
2013-5-11 15:40
朋友你好,这个问题有人发过帖子哦。我也回答过了。
==是关系运算符。
equals方法在object类中用于比较两个对象的地址值的。
作者:
曹睿翔
时间:
2013-5-12 10:10
及时更改问题状态,点编辑改为已解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2