问:
-------------------------------------------------------
StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
s1.equals(s2)//为什么是false
String s1 = new String("a");
String s2 = new String("a");
s1.equals(s2)//为什么是true
--------------------------------------------------------
答1:
-------------------------------------------------------
查阅javadoc后,估计是这个原因:
StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较地址的,所以等于false.
String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以会是
true。
-----------------------------------------------------------
答2:
-----------------------------------------------------
这是因为当String类创建了一个对象后,如果再创建的对象的值和已有的对象的值相同的话,编译器就不会再创建一个新的对象(和其他的类不同,这是个特例),而将新创建的reference变量和已有的对象关联。
equals()是比较值,当然相同。
如果你s1==s2;结果也是true,就是上面的道理。
----------------------------------------------------
答3:
----------------------------------------------------------
[quote]下面引用由ShootingStar在 2003/04/05 01:52pm 发表的内容:
这是因为当String类创建了一个对象后,如果再创建的对象的值和已有的对象的值相同的话,编译器就不会再创建一个新的对象(和其他的类不同,这是个特例),而将新创建的reference变量和已有的对象关联。
equals() ...
[/quote]
呵呵,你说的正好错误,String类是创建一个新的对象,而不是新创建关联(reference)。因为它是一个不变类(Immutable)。其他可变类是你所说的情况。创建新的关联。不相信的话,你可以输出s1 == s2的结果看看,是不是指向同一个地址。
下面是代码,在自己机器上测试一下就明白了
public class Test {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("a");
StringBuffer sb2 = new StringBuffer("a");
System.out.println("sb1.equals(sb2) : " + sb1.equals(sb2));//为什么是false
String s1 = new String("a");
String s2 = new String("a");
System.out.println("s1.equals(s2) : " + s1.equals(s2));//为什么是true
System.out.println("s1 == s2 : " + (s1 == s2));//为什么是false
}
}
---------------------------------------------------
本文讨论:
http://www.chinajavaworld.net/forum/topic.cgi?forum=20&topic=14935