黑马程序员技术交流社区
标题:
== 和equals 的区别
[打印本页]
作者:
丁一
时间:
2013-3-12 17:10
标题:
== 和equals 的区别
看见内容比较的问题,突然纠结了,== 和equals 有什么区别,他们又在什么情况下使用?
作者:
沉默de羔羊
时间:
2013-3-12 17:17
本帖最后由 沉默de羔羊 于 2013-3-12 17:18 编辑
这个问题,我只有给你举个例子来说明,这是我参加活动的一道题:
下面是我的作答,你看完了基本上对“== ” 和“equals"有一定的理解。
题目:Integer a = new Integer(100);Integer b = 100;Integer c =100;int d = 100; a、b、c、d这四个数通过“==”和equals方法,进行比较,都哪些结果是true,哪些是false.
需要明确的是:
“==”比较的是对象的地址。
“equals”比较的是对象的内容。
解题:
int是基本数据类型,默认值是0
Integer是int的封装数据类型(引用类型),默认值是null。
jdk1.5以上的版本中,基本类型和封装类能自动转化。
"=="比较
System.out.println(a==b); false,虽然是相同的数据类型,但是它们是两个对象,地址不同。
System.out.println(a==c); false,同上
System.out.println(a==d); false,它们是不同的数据类型(jdk1.5以上版本中为true,基本类型和封装类能自动转化)
System.out.println(b==c); true,100数值在常量池中,b和c都指向100,所以相同
System.out.println(b==d); false,它们是不同的数据类型(在jdk1.5以上版本中为true)
System.out.println(c==d); false,它们是不同的数据类型(在jdk1.5以上版本中为true)
"equals"比较,
注意:A.equals(B),因为equals比较的是两个对象,所以A,B都不能为基本数据类型,否则会出编译错误。)(jdk1.5以上版本中,B可以为基本数据类型,A不可以)
结果:
在jdk1.5以上的版本中,结果都是true。
在jdk1.5以下的版本中,比较的是对象两个变量指向的是对象的都为true,但是出现基本数据类型,就没办法通过,会报错。
作者:
于腾飛
时间:
2013-3-12 17:19
==他比较的是一个对象在内存中的地址值,
equals 是被用来检测两个对象是否相等,即两个对象的内容是否相等,
说白点, 一直是值比较 ,一个是对象比较 ,
equals是注意对象里的值 而==则注意两个对象是否想等 比如 A a = new A(); A b = a; 那么他们两个比较就会相等 a ==b 返回就会true。
作者:
冷叙辰
时间:
2013-3-12 17:33
==是用来比较内存中地址的,equals 是用来比较数值是否相等的
作者:
傅宇
时间:
2013-3-12 17:38
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如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。
如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
作者:
沉默de羔羊
时间:
2013-3-12 17:45
本帖最后由 沉默de羔羊 于 2013-3-12 17:46 编辑
要是说深了:
“==”和“equals”比较的是数据,而在java中数据类型,可以概况成值类型(基本类型)和引用类型(封装类型)。
1:值类型存储在内存的栈中。
2:引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
“==”对于值类型的数据比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在栈中存储的地址是否相同,即栈中的内容是否相同。
“equals”操作表示的两个引用型变量的内容是否相等,即堆中的内容是否相同。(这里需要注意的是:在jdk1.5以上版本,值类型和引用类型可以自动转化)。
说白了,就是:
“==”比较栈里的内容
“equals”比较的是堆里的内容
这里是我这周看资料。领悟的一些东西,希望对你有所帮助!有不同意见的可以指正,谢谢。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2