java比较两字符串是否相等。。。

代码如下,我不明白为什么 一个输出true,一个输出false。

String string1 = "i love you";
String string2 = "i love you";
//输出 true
System.out.println(string1 == string2);

String string3 = new String("i love you");
String string4 = new String("i love you");
//输出 false
System.out.println(string3 == string4);

以下是我的思考过程,麻烦看看我哪里考虑错了。

string1,string2,string3,string4 都应该是引用类型吧,既然是引用类型,双等号的意思就是判断两者的内存地址是否一样。 那么,同样是String类型,为什么 string1 和string2 的内存地址就一样,而string3,string4 的内存地址就不一样呢?

第1个回答  2011-08-13
"i love you"本身就表示一个String对象你将它赋给string1,string2 就是把这个对象的地址赋给2个变量。
public String(String original)这个构造函数初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;
换句话说,新创建的字符串是该参数字符串的副本
string3和string4是不同的副本,地址自然不同
我这么理解的
第2个回答  2011-08-16
主要还是堆和栈、==和equals的区别,知道这两个了,就好理解了。
第3个回答  2011-08-14
string1 ,string2都是在字符串常量池中取出来的,比较的是值。 故相等;
String3,String4是重新生成的对象,比较的是地址值,不同的对象内存分配的地址值当然不相等
第4个回答  2011-08-16
字符串的比较:
一种比较的是值:如String1和String2之间比较的是值
一种比较的是地址:String3和String4之间产生的是对象,对象比较的是空间地址,String3和String4产生的是两个不同的对象,故是不同的空间地址
第5个回答  2011-08-20
为true是因为这两个字符串真的相等,为false是因为比较的是两字符串的对象的指针,是代表的内存的一个地址,所以就为false了。
相似回答