String s = "yz";
String s1 = "xyz"; 
String s2 = "x"+"yz";
String s3 = "x"+new String("yz"); 
String s4=new String("xyz");
String s5 = "x"+s;
System.out.println(s1==s2);true
System.out.println(s1==s3);false
System.out.println(s1==s4);false
System.out.println(s4==s3);false
System.out.println(s2==s5);false能详细解释下么?

解决方案 »

  1.   

    对像的比较要用到,对象的equals方法。直接的比较只是内存地址的比较。
      

  2.   

    String s="" 这种是直接开辟内存空间 然后把值放进去
    但是NEW的时候是创建一个新的内存空间然后指向这个值.String s1="1",s2="1"  这种赋值是先在查找字符串池中找有没有值 有的话直接引用同一个地址,没有的话另外开辟例如:
    s1==s2 返回true       --这个比较的是内存地址而不是值
    s1.equals(s2)返回true --这个比较的是内容不是内存地址
    但是如果是 new String("1")  new String("1") 他们2个==时返回FALSE  equals返回true
      

  3.   

    这个问题嘛  请看http://ganlisxn.javaeye.com/blog/228607弄清楚String s2 = "x"+"yz"; 
    String s3 = "x"+new String("yz"); 
    的区别就知道怎么回事了
      

  4.   

    String s5 = "x"+s;         这种情况是直接去常量池找  还是直接开辟新的内存呢??
      

  5.   

    你可以这样试一下s1="x"+new String("y");
    s2=="x"+new String("y");然后用==和equals 总之==比较内存地址,equals比较值
      

  6.   


    用字面量的形式声明的字符串是存放到栈中的,栈中字符串池是可复用的,上述描述中是s1.s2是位于同一个内存地址
    new出来的String都是在堆中新开辟一片空间的,内存地址是不一样的,上述描述中s3,s4,s5都是在堆中新产生一个对象,内存地址并不一样,只是内容相同而已
      

  7.   

    http://hi.baidu.com/xun1573/blog/item/42617ad8acab333332fa1c63.html
    ==操作符会返回true如果一些引用指向一个相同的对象但不会判断String对象的内容是否相同
    ==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。 
    String.equals()方法会返回true如果被操作的String对象的内容相同。
      

  8.   

    对像的比较要用到,对象的equals方法。直接的比较只是内存地址的比较。
      

  9.   

    s1==s2 返回true      --这个比较的是内存地址而不是值 
    s1.equals(s2)返回true --这个比较的是内容不是内存地址 
      

  10.   

    s1==s2返回true,是因為String s2 = "x"+"yz";"x"和"yz"都是常字串,編譯時應該會優化為"xyz",那麼由於是以常量來賦值,會先在字符串池中找有沒有己存在的,所以s1==s2為true,可以參考一下字符串的intern方法
      

  11.   

    new String("yz"); 
    这是创建另一个内存.
      

  12.   

    对象的equals方法。直接的比较只是内存地址的比较