public class Test
{
public static void main(String args[])
{
String s0 = "Hello";
String s1 = "Hello";
String s2 = "Hell" + "o";
String s3 = new String("Hello");
String s4 = new String("Hello");
System.out.println(s0 == s1);  //true
System.out.println(s1 == s2);  //true
System.out.println(s1 == s3); //false
System.out.println(s3 == s4); //false
System.out.println(s3.equals(s4)); //true
System.out.println(s2.equals(s3)); //true
}
}刚学java,有些东西不理解。上面这段代码中s3、s4不是指向同一个对象,s0、s1为什么指向同一个对象?String s0 = "Hello";和String s3 = new String("Hello");不是等同的吗?请教大家这两句有什么区别。

解决方案 »

  1.   

    引用对象之间的比较要用equals
    你试下System.out.println(s1.equals("s3"));结果应该是true.
      

  2.   

    看错了  应该是System.out.println(s3.equals("s4"));结果为true
      

  3.   

    String s1 = "Hello";
    String s2 = "Hell" + "o";
    s1,s2赋值的时候会先找内存池,看有没有相同的字符串
    String s3 = new String("Hello");
    String s4 = new String("Hello");
    s3,s4在内存中地址不一样,s3 == s4是地址的比较
      

  4.   

    要理解一点 JAVA中间的任何变量都是引用  理解了这一点  这个问题就不难了
      

  5.   

    ==是测试是否指向同一个对象的,equals()是测试值是否相等的,这我知道。我主要想知道String s0 = "Hello";和String s3 = new String("Hello");这两句有什么区别?我以前一直以为这两句是一样的,我以为String s0 = "Hello";是String s3 = new String("Hello");的简写形式而已,这个例子测试的结果这两句是不同的,但是我又说不出为什么会不同,所以想请教。
      

  6.   

    是这样的S0 是把数据放在缓冲池中间 ,S3 是在动态分配区重新申请一块内存
    String s0 = "Hello" 是先在缓冲池中找有没有相同的数据有的话直接把s0映射到这个地址
    String s3 = new String("Hello"); 是在内存中申请一个新的区域 把"Hello"写进去,再把这个区域的首地址给s3,所以地址会不同