public class Test123 {
private static String s1="string";
public void method(String str1,String str2){
str2=str2+"c";
System.out.println("str1==str2: "+(str1==str2));
}

public static void main(String []a){
String s2 = "string";
String arg="strin"+"g";
System.out.println("s1==arg: "+(s1==arg));
System.out.println("s2==arg: "+(s2==arg));
System.out.println();

Test123 yy = new Test123();
yy.method("abc", "ab");
}
}运行结果如下:
s1==arg: true 
s2==arg: truestr1==str2: false我想问s1==arg,s2==arg,为什么返回真?
他们不是不同的对象么,不是应该用equals才会返回真么?
str1==str2: false 又作何解释?
头痛中.请教各人达人。

解决方案 »

  1.   

    http://blog.csdn.net/java2000_net/archive/2008/10/24/3137426.aspx
      

  2.   

    这和String连接池有关系
    ==比的是引用
    只有当两个变量同时指向一个地址时
    才返回ture
    这种形式的String s1 = "string"; 
    在datesegment里的String连接池中创建了一个字符串
    而下次String s2不是new出来的话
    也会在String连接池找有没有对应的字符串
    如果原先有已创建的字符串
    那么,不会再新创建
    s2也会指向s1的地址
    而在连接池中
    比的是equals
    所以String arg="strin"+"g"; 
    这种拼串的方式得到的和前面一样
    也就是说s1,s2,arg同时指向一个地址
      

  3.   

    常量池,不是连接池。
    好像对==和equals也没有真正弄清楚。
      

  4.   

    可以给我解释一下method方法里面的str1==str2: false 么?
    感觉有些概念混淆。 
      

  5.   

    不用弄那么清楚。记住一点,你打算比较内容,就使用equals方法,你要比较两个引用是不是指向同一个对象,才用==
      

  6.   

    - -
    其实是一个面试题来的。
    平常都用equals的。明天要去面试,于是就拿出题来做
    发现这个东西没理解。
    string 这个东西很难看透啊!
      

  7.   

    str1和str2是两个不同的引用,所以是false.
    不要误解为指针了
      

  8.   

    呵呵,我也是刚注意到的
    看了一下,有认识了不少东西
    谢谢ZangXT
      

  9.   


    public class xx{
    public static void main(String[]args){
    String s1="phenix1"+"phenix2";//两个字符串常量相加的结果会在常量池创建
    String s2="phenix1phenix2";
    System.out.println(s1==s2);
    String s3="phenix3";
    String s4=s3+"phenix4";//当有变量和另一个字符串常量相加时不会在常量池创建结果。
    String s5="phenix3phenix4";
    System.out.println(s4==s5);
    }
    }