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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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. }
复制代码


5 个回复

倒序浏览
我想知道为什么最后一个输出是false?
回复 使用道具 举报
为啥子没有人给老夫解释一下这个问题呢、
回复 使用道具 举报
wawsc5354524 发表于 2014-8-25 22:00
为啥子没有人给老夫解释一下这个问题呢、

StringBuffer是一个容器,意识是传入一个abc字符串的地址到StringBuffer里,说以c是abc的地址而不是abc所以为flase
回复 使用道具 举报

  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中的。
复制代码

回复 使用道具 举报
本帖最后由 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, 那我们也遵守这个规则吧.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马