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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 逝者轨迹 于 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


4 个回复

倒序浏览
本帖最后由 付银攀 于 2013-5-2 21:09 编辑

看了下api关于equals的解释是这样的
public boolean equals(Object anObject)
    将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
参数anObject要求是一个String对象,而c是一个StringBuffer对象,虽然字符序列一样但是结果还是false

评分

参与人数 1黑马币 +2 收起 理由
逝者轨迹 + 2 赞一个!

查看全部评分

回复 使用道具 举报
StringBuffer     c 是一个字符串变量,a 是字符串常量
回复 使用道具 举报
c还是引用类型的,两个比较的不是同一个对象,所以不相等,要是基本类型比较的话,就是true
回复 使用道具 举报
本帖最后由 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

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