黑马程序员技术交流社区

标题: 关于==与equals的问题 [打印本页]

作者: jialihong    时间: 2013-7-25 18:38
标题: 关于==与equals的问题
本帖最后由 杨兴庭 于 2013-7-25 23:21 编辑

基本数据类型用"=="判断,其他类型要用equals判断,这句话应该是正确的吧?

作者: nuoxi0318    时间: 2013-7-25 18:44
在比较时先调用hashCode方法,如果不相同,证明不相等。
如果相同,再调用equals方法,如果equals方法相同,证明相等,不相同,证明不相等。

==:主要用在基本数据类型及引用
Equals:主要是对象或对象引用的比较。

集合中是否包含某一个元素用contains来判断。
作者: 薛淑凯    时间: 2013-7-25 18:51
对于引用数据类型,如果没有复写equals方法的话,就会调用Object中的equals方法,而Object类中equals方法底层调用的是==
作者: Joesph    时间: 2013-7-25 18:57
= =是面向过程的操作符;equals是面向对象的操作符

= =不属于任何类,equals则是任何类(在Java中)的一个方法;

我们可以1)Primitive1 (基本类型)= = Primitive2(基本类型);

         2)Object Reference1(对象引用)= = Object Reference2(对象引用)

         3)Object Reference1 (对象引用) .equals(Object Reference2 (对象引用))

这三种比较但却不能   Primitive1 (基本类型).equals( Primitive2(基本类型));

对于基本类型,没有面向对象中发送消息一说,自然也不会有

方法成员。

作者: yangchao8907    时间: 2013-7-25 19:48
我觉得可以这么记:==必须内存地址相等,equals()判断值相等。简单易记!
作者: 王峰230321    时间: 2013-7-25 20:12
我都知道 你为什么 会问这个问题 .  哈哈.   
因为 毕老师在 视频里 .  比较的年龄 全部用的 ==   .  但是 比较名字 字符串的时候用的是equals.
这样做.  只有一个原因..  因为 ==  好写!!! ..  .
==比较 地址值 这些 大家 都知道.    可是 明显  int i=1    和 int j=1   
这明显是两个对象啊 . 如果真的比较地址值肯定是假啊!
是因为.  在JAVA中.  当一个对象在初始化时, 如果达不到一个字符的长度.  那么 就不会创建新的对象.    也就是长度在btye之内.  都是同一个对象. -128 至127之间
如果是int i=128  int j=128   .  这样 用 i==j  的话 返回的 就是假 .         

作者: の放下执著    时间: 2013-7-25 21:04
不一定的,在object类中的equals方法就就是当且仅当要比较的两个引用指向同一个对象时才返回真,但在String类中就复写了equals方法,用于两个引用比较内容是否相等。例如当对象要放入集合HashSet时就必须要复写equals方法了。"基本数据类型用"=="判断,其他类型要用equals判断",其实没有那么绝对的,主要是看你想实现什么功能。

作者: 张亚军    时间: 2013-7-25 21:09
本帖最后由 张亚军 于 2013-7-25 21:13 编辑

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

     如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。

     equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:

     String a=new String("AAA");

     String b=new String("AAA");

     System。out.println(a==b);//这个是比较内存地址即栈内存的值是否相等,开辟了2个内存空间,所以地址逼向等结果为false     System。out.println(a.equals(b)); //这是比较堆内存中的实例对象,new出来的对象都是AAA,所以相等,结果为true
     






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