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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

王华

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 王华 初级黑马   /  2012-8-5 20:56  /  2205 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

"=="equals方法究竟有什么区别?

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1 好吧!还是鼓励一下!建议这样的问题先去看.

查看全部评分

10 个回复

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

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



下个张老师的葵花宝典吧(张孝祥就业面试宝典,很牛叉的~~)
回复 使用道具 举报
在没有重写Object类的equals方法前,==和equals都是比较地址,public boolean equals(Object obj) {
        return (this == obj);
    }地址一样就相等,重写后,就看你个人想怎样定义两个对象相等的方式。
回复 使用道具 举报
这题很多人问过了,建议楼主去看看http://bbs.itheima.com/forum.php ... ;pre_pos=5&ext=
equals方法,如果没有被重写就是引用Object的方法。也就是比较两个对象是否相同,是否是一个对象,==是比较地址值。
附别人画的equals文档

1233.jpg (110.19 KB, 下载次数: 6)

1233.jpg
回复 使用道具 举报
嘎嘎,这个问题不能再加分了。太泛滥了

评分

参与人数 1黑马币 +10 收起 理由
张_涛 + 10 赞一个!

查看全部评分

回复 使用道具 举报
如果操作的对象引用变量指向的是对象,就比较引用变量是否指向同一个对象。如果两边是基本数据类型,比较的就是引用变量指向的值。
如果不重载equals方法,则自动调用Object的equals方法,则和==一样,在String,Integer类中默认重载了equals方法,比较的是对象的内容。
在实际编程中建议使用equals方法。
回复 使用道具 举报
胡文凡 发表于 2012-8-5 22:48
嘎嘎,这个问题不能再加分了。太泛滥了

嘿嘿!上面只是鼓励一下呢!一般不加的!
回复 使用道具 举报
我也觉得,这个很太简单了, 书上,视频,什么资料上都会详细说明的,  
  不过,新人上路还是需要鼓励一下的 {:soso_e113:}
回复 使用道具 举报
"=="  比较 的 是地址  
"equals" 比较的是字符串是否相等、

我没有启动软件、所以在网上取得材料
解释一下==号,他比较的是一个对象在内存中的地址值,
比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。

equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。

在Object类源码中是这样写的。
public boolean equals(Object obj) {
return (this == obj);
}
他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。
public boolean equals(Object anObject) {
if (this == anObject) {
     return true;
}
if (anObject instanceof String) {
     String anotherString = (String)anObject;
     int n = count;
     if (n == anotherString.count) {
  char v1[] = value;
  char v2[] = anotherString.value;
  int i = offset;
  int j = anotherString.offset;
  while (n-- != 0) {
      if (v1[i++] != v2[j++])
   return false;
  }
  return true;
     }
}
return false;
    }

String里的方法,如果==号比较不相等,还会进行一下值的比较。
所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价。
回复 使用道具 举报
对于值类型来说是没有equals 方法的。
equals 是引用类型的比较方法,但==也有能比较引用类型。
它们的区别在于:
        equals比较的是两个 引用类型的值是否相等;而==比较的是内存地址是否相同,是绝对的相等比较。
        例如:String a = new String("abc");String b = new String("abc");
               new了两个引用类型的变量 a,b
            equals比较:a和b是相等的,因为它们的值都是 abc;
            ==比较:a和b是不等的,因为它们是声明的不同变量,它们指向的内存地址是不同的,
                          相当于两个人只是长得一模一样,但门牌号不一样(可以这样理解);

特例:
       关于string的特例:
            例如:String a = "abc";String b = "abc";
           声明了两个引用类型变量a,b
      ==情况下,它们也是相当的,为什么呢?String也是引用类型为什么会相当呢?
      原因是因为java vm(虚拟机) 在处理String声明时,是先到内存池中找有没有相等的      
       有就指向它,没有就创建;因此两个String指向的是同一个地址,所以相等。
回复 使用道具 举报
瞿乐 发表于 2012-8-5 23:15
我也觉得,这个很太简单了, 书上,视频,什么资料上都会详细说明的,  
  不过,新人上路还是需要鼓励一下 ...

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