黑马程序员技术交流社区
标题:
最后一行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 编辑
String a="abc";//它只 在堆中创建一个对String类的对象引用对象a,然后查找栈中是否有String类型的对象"abc",若没有则将"abc"存放进栈,并令a指向"abc",若已经存在则直接令a指向"abc".
复制代码
StringBuffer c=new StringBuffer("abc");//所有通过new操作符的操作都是在堆完成的,它创建两个对象StringBuffer类型 对象”abc“和StringBuffer类型引用对象 c,然后查找栈内存中是否有StringBuffer类型的对象“abc”,如果有则直接将c指向栈中的对象"abc",如果没有则将对象“abc”压入栈中
复制代码
String e=new String("abc"); //在堆内存创建
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