黑马程序员技术交流社区

标题: 大神帮我看看这个小程序,解释一下他们的区别? [打印本页]

作者: wawsc5354524    时间: 2014-8-24 23:14
标题: 大神帮我看看这个小程序,解释一下他们的区别?
  1. package com.itcast.test007;

  2. public class Demo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 String a=new String("abc");
  7.                 String b=new String("abc");
  8.                 StringBuffer c=new StringBuffer("abc");
  9.                 System.out.println(a==b);
  10.                 System.out.println(a.equals(b));
  11.                 System.out.println(a.equals(c));
  12.         }

  13. }
复制代码



作者: wawsc5354524    时间: 2014-8-24 23:16
我想知道为什么最后一个输出是false?
作者: wawsc5354524    时间: 2014-8-25 22:00
为啥子没有人给老夫解释一下这个问题呢、
作者: 曾小贤OL    时间: 2014-8-25 23:22
wawsc5354524 发表于 2014-8-25 22:00
为啥子没有人给老夫解释一下这个问题呢、

StringBuffer是一个容器,意识是传入一个abc字符串的地址到StringBuffer里,说以c是abc的地址而不是abc所以为flase
作者: hejinzhong    时间: 2014-8-26 09:09

  1. (1)我们的上帝类(object)提供了一个equals方法含义如下:
  2. Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
  3. 用一句通俗的话说,就是这个equals比较的是两变量引用的对象是否是同一个。       
  4. (2)都知道String继承object之后,对该方法进行了重写,(API)方法含义如下:
  5. 覆盖:类 Object 中的 equals
  6. 将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
  7. 也用一句话说:这里的equals比较的是两变量引用的对象的内容是否相等。
  8. (3)而StringBuilder继承object后,并没有去覆写该方法。
  9. (4)这个false理解:大的方面说,他们两个原本就不是一个类型的对象,没哟可比性。也可以这么说,也可以认为都向上转型为object,采用的的equals并不是String中的。
复制代码


作者: zuochbd    时间: 2014-8-26 10:05
本帖最后由 caixingke 于 2014-8-26 10:09 编辑

如有疑问, 应当先查下源代码啊.
String类中的equals(Object):boolean方法的源码如下:
  1.     public boolean equals(Object anObject) {
  2.         if (this == anObject) {
  3.             return true;
  4.         }
  5.         if (anObject instanceof String) {
  6.             String anotherString = (String)anObject;
  7.             int n = value.length;
  8.             if (n == anotherString.value.length) {
  9.                 char v1[] = value;
  10.                 char v2[] = anotherString.value;
  11.                 int i = 0;
  12.                 while (n-- != 0) {
  13.                     if (v1[i] != v2[i])
  14.                         return false;
  15.                     i++;
  16.                 }
  17.                 return true;
  18.             }
  19.         }
  20.         return false;
  21.     }
复制代码
我们可以看到, 如果传向的对象类型不是String的话, 直接返回false
楼上一些说法是不准确的.
如果愿意的话, 我们也可以让传进行的StringBuffer对象返回true的.
当然, 既然JAVA官方认为这不同类型的对象进行equals判断时, 应当返回false, 那我们也遵守这个规则吧.





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