参考了String的不变性以后,写了以下验证:public class strConcat{
public static void main(String[] args){
String str2=new String("ABC");
String str1="ABC";
String str0="ABC";
//str1=str1+"2_3_";
System.out.println("str1:"+str1);
System.out.println("str0:"+str0);
System.out.println("str2:"+str2);
System.out.println("str1==str0:"+str1==str0);
System.out.println("str1==str0:"+String.valueOf(str1==str0));
System.out.println("str1==str2:"+String.valueOf(str1==str2));
System.out.println("str1 equals str0:"+str1.equals(str0));
System.out.println("str1 equals str0:"+str1.equals(str0));
}
}提问在楼下:

解决方案 »

  1.   

    System.out.println("str1==str0:"+str1==str0);//这一句会直接输出false,连前面的提示都没有怎么回事?
    System.out.println("str1==str0:"+String.valueOf(str1==str0));//我调试了很久,同上如果不加String.valueOf也是直接false,怎么回事?
      

  2.   

    String str2 = new String("ABC");//用这个语句以后对象是创建到堆(heap)还是栈(stack)?
      

  3.   

    运算符的优先级和计算顺序问题("str1==str0:"+str1==str0)这里先计算加号再判断==,即 (("str1==str0:)+str1)==str0如果要达到你的目的,需要添加一对括号,修改为  println("str1==str0"+(str1==str0))
      

  4.   

    1.System.out.println("str1==str0:"+(str1==str0));
    2.堆
      

  5.   

    str2不是在栈里面,然后引用堆里面的"ABC"么?
      

  6.   

    str2 是在栈里 
    "ABC"是在堆里
    =号的作用是把"ABC"的引用给str2
      

  7.   

    关于String我是听过一个String pool的概念:
    str1="ABC";
    str2="ABC";
    如果不用new创建String
    str2的时候就会先在pool里找有没有"ABC"这里引用str1指向了"ABC"所以就把str1的引用给了str2.即:str2=str1;
    所以两个引用指的是同一个地方
    我想知道如果用new创建以后对象是在堆还是栈
      

  8.   

    System.out.println("str1==str0:"+str1==str0);这句
    因为计算运算符比比较运算符优先级高 所以先计算"str1==str0:"+str1 然后才用==和str0比较 当然就是false了 应改为System.out.println("str1==str0:"+(str1==str0));加上括号就不受优先级影响了
      

  9.   

    new String("ABC")直接在堆里创建"ABC"
      

  10.   

    1.优先级问题:改为System.out.println(str1==str0);
     新的对象会创建在 堆 中,对象的引用存储在 栈 中当String str2 = new String("ABC");
    会在常量池中存在一个 ABC的字符串 ,在堆中创建一个String的对象,在栈中存储 这个对象的引用str2;常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量,Java会确保一个字符串常量只有一个拷贝
    所以str1==str0是正确的2.String.valueOf();是String的静态方法,在这里应该是首先计算 str1==str0 返回true后
    由String.valueOf()将其转换为String在赋予+操作
      

  11.   

    谢谢大家那么热情,我发贴不多,也不知道给分是怎么一回事
    这下不知道怎么补偿大家的辛苦了
    特别感谢redduke1202,该不是去查阅了资料了吧?,谢谢
    我也要去查阅一翻