public class Test1 {
public static void main(String args[])
{
String x="a";
String y="a";
System.out.println(x==y); //This is true?Why?

String A="hello";
String B=" world";
String C="hello world";
String D="hello world";
A+=B;
System.out.println(A==C);//This is false?Why?
System.out.println(C==D);//This is true?Why?

String H=new String("hello");
String J=new String("hello");
System.out.println(H==J);//This is false?Why?
}
}

解决方案 »

  1.   

    对象名中存放的对象的引用(地址),不同的对象地址不同。x==y只有当x和y引用同一对象的时候才为true,否则为false。比较不同对象内容是否相同,应该使用equals方法你的注释中的答案好像有问题,应该都是false
      

  2.   

    那两个为true,我知道原因。string对象本身因为是不可改变的,所以给两个string对象赋值的时候,如果值一样(就像两个“a”,两个“hello world”一样)的话,他们是共用一块存储空间的,所以“==”为真。其余三个解释同意楼上。
      

  3.   

    用==比较的是地址
    String H=new String("hello");
    String J=new String("hello");
    H和J虽然内容相同但是都使用了new分配了地址,所以用==返回的是false
      

  4.   

    对,我主要就是想问
    String x="a";
    String y="a";
    System.out.println(x==y); //This is true?Why?
    这儿为什么会是输出的true?
    stamp80(峰) ( ) 信誉:105 ,谢谢!不好意思,能不能说得详细些?
      

  5.   

    String x="a";首先这是两个对象,a是一个,x是指向a的引用对象.
    String y="a"; 那么这个你也可以理解啦,也是两个对象,y也指向a ,
    所以x==y比较他们所指向的地址时是相同的。String H=new String("hello");  
    String J=new String("hello");
    这两个前面加拉个new 就是新开辟一块内存,H指的hello的地址,和J指的hello地址是不同的
    所以 H==J 是False
      

  6.   

    String s=new String("abc");是在栈中定义一个字符串指针,指向堆中新建的"abc"字符串。
    所以H,J的值是两个指针,分别指向的是两个各自创建的堆中的"abc",注意:是2个各自新建的"abc",就是说不是同一个字符串。而如果用equals方法比值(比较指向字符串的值)是相等的。
    而String s="abc";是创建一个字符串指针,指向常量池中的"abc",所以无论创建几个String,它们的值都是常量池中"abc"的地址,也就是相等的。
      

  7.   

    你用x=new String("a");y=new String("a");试试然后再比较x==y看看得到的是什么结果?
      

  8.   

    public class Test {
    public static void main(String args[]){ 
    String x="a";//"a"分配内存r   x引用r
    String y="a";//y引用r
    System.out.println(x==y); //This is true?Why?地址相同

    String A="hello";//"hello"分配内存rm1  A引用rm1
    String B=" world";//" world"分配内存rm2 B引用rm2
    String C="hello world";//"hello world"分配内存rm3 
    String D="hello world";
    A+=B;//A+B 分配内存rm4 A引用rm4
    System.out.println(A==C);//This is false?Why?地址不同
    System.out.println(C==D);//This is true?Why?地址相同

    String H=new String("hello");//分配内存r1
    String J=new String("hello");//分配内存r2
    System.out.println(H==J);//This is false?Why?地址不同
    }
    }
      

  9.   

    哈哈,懂了!!
    比较接受aaa2003gf() ( ) 信誉:100 
    虽然sky_boxer(饿鱼骨头) ( ) 信誉:100 的能解释得通,但我记得在java中不像c/c++,它是不存在指针(好像它全部是在变量存储在堆中,不太记得这个)总之,感谢大家!!