黑马程序员技术交流社区

标题: 最后一行a.equals(c)为什么是false 他和a.equals(e)有什么不同(... [打印本页]

作者: 逝者轨迹    时间: 2013-5-2 20:07
标题: 最后一行a.equals(c)为什么是false 他和a.equals(e)有什么不同(...
本帖最后由 逝者轨迹 于 2013-5-2 23:16 编辑

String a="abc";
  String b="abc";
  System.out.println(a==b);   //true
  System.out.println(a.equals(b));//true
  
  StringBuffer c=new StringBuffer("abc");
  StringBuffer d=new StringBuffer("abc");  
  System.out.println(c==d);   //false
  System.out.println(c.equals(b));//false
  
  String e=new String("abc");
  String f=new String("abc");
  System.out.println(e==f);  //false
  System.out.println(e.equals(f));  //true
  
  System.out.println(a==e);  //false
  System.out.println(a.equals(e));  //true
  
  System.out.println(a.equals(c));  //false



作者: 付银攀    时间: 2013-5-2 20:58
本帖最后由 付银攀 于 2013-5-2 21:09 编辑

看了下api关于equals的解释是这样的
public boolean equals(Object anObject)
    将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
参数anObject要求是一个String对象,而c是一个StringBuffer对象,虽然字符序列一样但是结果还是false
作者: 赵利斌    时间: 2013-5-2 20:59
StringBuffer     c 是一个字符串变量,a 是字符串常量
作者: 赵利斌    时间: 2013-5-2 21:02
c还是引用类型的,两个比较的不是同一个对象,所以不相等,要是基本类型比较的话,就是true
作者: vigiking    时间: 2013-5-2 23:24
本帖最后由 vigiking 于 2013-5-2 23:27 编辑
  1. String a="abc";//它只 在堆中创建一个对String类的对象引用对象a,然后查找栈中是否有String类型的对象"abc",若没有则将"abc"存放进栈,并令a指向"abc",若已经存在则直接令a指向"abc".
复制代码
  1. StringBuffer c=new StringBuffer("abc");//所有通过new操作符的操作都是在堆完成的,它创建两个对象StringBuffer类型 对象”abc“和StringBuffer类型引用对象 c,然后查找栈内存中是否有StringBuffer类型的对象“abc”,如果有则直接将c指向栈中的对象"abc",如果没有则将对象“abc”压入栈中
复制代码
  1. String e=new String("abc"); //在堆内存创建
  2. String类型对象abc和String类型的引用对象e然后查找栈内存中是否有String类型对象“abc”,如果有则直接将e指向栈中的对象"abc",如果没有则将对象“abc”压入栈中[
复制代码
equals()方法在基本类型里是比较值 在引用类型里是比较地址(即比较这两个引用是否引用的是同一个对象)
所以①a.equals(c)//a指向栈内存中String类型的对象“abc”,c指向栈内存中StringBuffer类型的对象”abc“,所以a和c引用的不是同一个对象故返回false;
②a.equals(e)//a指向栈内存中String类型的对象“abc”,e指向堆内存中的String类型的“abc”二者引用的是同一个String类型的对象故返回所以返回的是true






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