Java:用String str = ” “创建两个对象,两个String对象==为啥是false呢?s4指向了新的对象还是其他原因

String s1 = "ja";
String s2 = "va";
String s3 = "java";
String s4 = s1 + s2;
System.out.println(s3 == s4);//false

这是一个基本功的问题,你将==和equals搞混了。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。你现在是字符串,如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。

equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同,所以只要没有重写,就能比较。

所以最后一句应该改成这样:
System.out.println(s3.equals(s4));
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-25
解释一下==号,他比较的是一个对象在内存中的地址值,
比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。

equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。

在Object类源码中是这样写的。
public boolean equals(Object obj) {
return (this == obj);
}
他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}

String里的方法,如果==号比较不相等,还会进行一下值的比较。
所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价。
由于String类已经重写了equals方法,所以要判断两个字符串是否相等的时候,可以用str1.equals(str2)来判断str1和str2是否一致
第2个回答  2011-03-25
当2个字符串变量相加的时候会产生一个新的字符串对象,就以上面的例子来说:
String s1 = "ja";
String s2 = "va";
String s3 = "java";
String s4 = s1 + s2;
System.out.println(s3 == s4);//false
System.out.println(s3 =="ja"+"va");//true本回答被提问者采纳
第3个回答  2011-03-25
因为s3和s4是两个不同的对象,就像c语言中的指针,他们的指向是不同的,==判断的是对象是否相等,你改成System.out.println(s3.equals(s4));就是true了,equals()方法时判断两个值是否相等,显然s3和s4的值相等,都是"java"。
第4个回答  2011-03-25
== 是比较内存地址的,
s1,s2,s3分别指向三块内存地址,但是 s1+s2 后应该会分配一块新的内存地址,正是s4指向的内存地址,所有最后为false