java程序问题:求程序运行结果解释!

程序:
public class StringDemo {
public static void main(String[] args) {
String s1="Hello";
String s2="Hello";
String s3=new String("Hello");
String s4=new String("Hello");
//相等否
System.out.println("s1==s2"+(s1==s2));
System.out.println("s3==s4"+(s3==s4));
System.out.println("s1==s3"+(s1==s3));
//值相等否
System.out.println("s1 equals s2"+s1.equals(s2));
System.out.println("s3 equals s4"+s3.equals(s4));
System.out.println("s1 equals s3"+s1.equals(s3));

System.out.println("s1==s2"+s1==s2);
System.out.println("s3==s4"+s3==s4);
System.out.println("s1==s3"+s1==s3);

}

}

结果:
s1==s2true
s3==s4false
s1==s3false
s1 equals s2true
s3 equals s4true
s1 equals s3true
false
false
false
请仔细分析不同,答得好的追加分数

首先让我们来看下着4个语句,
String s1="Hello";//先在字符串池中查找是否有值为"Hello"的字符串,没有找到则新建一个 此时 s1指向字符串池中"Hello"
String s2="Hello";//在字符串池中查找字符串,发现存在"Hello"字符串,s2指向字符串池中"Hello" s1和s2指向的内存相同
String s3=new String("Hello");//对于new String() 则是在java的堆中新建一个字符串,他的内存地址不是指向字符串池
String s4=new String("Hello");//同上
对于字符串 == 操作符来说 比较的内存地址值 可以得出
s1==s2true
s3==s4false
s1==s3false
equals()方法则是比较内容值 可以得出 s1 s2 s3 s4的值都是Hello
s1 equals s2true
s3 equals s4true
s1 equals s3true
对于这个则是
System.out.println("s1==s2"+s1==s2);
先进行+操作 然后再比较 上面实际上是 "s1==s2Hello"==s2的比较自然是false
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-10
s1 s2 指向的是同一个存储地址,所以相同;使用new String ()新建对象后,虽然看上去他们的值相同,但是他们却分配了两个不同的存储空间,使用==比较的时候自然是false,equips比较他们的内容,而不是地址,所以会true。希望帮到你啦
第2个回答  2011-05-10
首先要明白String的初始化对象的原则。s1,s2这种初始化后s1,s2是同一对象而关系运算符“==”是判断两个对象是否是一个,所以输出1 是 false ;s3,s4这种初始化后的s3,s4是两个不同的对象只是值相同而已。 方法.equals是比较对象中的值是否相等,当然如果两个是同一个对象输出也是true。在你第三类输出中,由于没有()所以运算符的顺序是这样的先""+s 得到一个新的对象 然后和后面的 s* 进行== 运算 所以输出都是false
相似回答