String str1 = "a";
String str2 = "bc";
String str3 = "a"+"bc";
String str4 = str1+str2;

System.out.println(str3==str4); str4 = (str1+str2).intern(); System.out.println(str3==str4);输出的结果将会是:
false
trueintern()方法的作用是检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。而我不明白的是:为什么str3与str4引用的不是同一个对象?

解决方案 »

  1.   

    String是不变,对它的任何处理都会返回新的String实例。String str3 = "a"+"bc";在编译后就完全等于 String str3 = "abc";运行这段代码后,符串池里就存在"abc"
    String str4 = str1+str2;执行之后,会创建一个新的String变量(堆里的一个内存块),然后让str4指向这个新的变量。所以,一开始的str4和str3引用的不是同一个对象
      

  2.   

    String str1 = "a";
    String str2 = "bc";
    String str3 = "a"+"bc";
    String str4 = str1+str2;

    System.out.println(str3==str4); str4 = (str1+str2).intern(); System.out.println(str3==str4);
    str3指向常量池中的abc。str1+str2指向堆中的abc  ,intern()后返回常量池中的abc的引用,也就是str3,str4都指向常量池中的abc,所以指向的是同一个对象
      

  3.   

    我只多增加了一个输出,你看看就明白了
    String str1 = "a";
    String str2 = "bc";
    String str3 = "a" + "bc";
    String str4 = str1 + str2; System.out.println(str3 == str4);
    System.out.println(str3.equals(str4)); str4 = (str1 + str2).intern(); System.out.println(str3 == str4);
      

  4.   

    第一个输出false是因为程序创建了两个string 对象,这两个对象当然不相等。
    第二个输出true是因为两个字符串引用的是同一个string对象。
      

  5.   

    String str1 = "a";
    String str2 = "bc";
    String str3 = "a"+"bc";
    String str4 = str1+str2;

    System.out.println(str3==str4); str4 = (str1+str2).intern(); System.out.println(str3==str4);
    我也不明白   str1+str2不就是abc么 abc已经在池中了 为什么str4还会和str3指向的不是同一个对象 ?  还有大家说的 String str4 = str1+str2;是在堆中创建str4.  什么情况下会在堆中创建?
      

  6.   

    str1和str2都是变量,str4在编译期不能决定值,所以不会使用常量池中的字串。
      

  7.   

    当CLASS文件初次被加载的时候,先在堆中分配空间,然后初始化;
    String str1 = "a";
    String str2 = "bc";
    就是在这个时候进行的初始化(当然之前还有一些其它的,比如STATIC)str3指向一个字符串池ABC,而str4仍然指向堆中;但是在进行(str1+str2).intern();操作后,也是指向池中的ABCintern()可以查询文档
      

  8.   

    我找到一种说法,不知道正确不正确。
    字符串字面池指的是常量池.
    字符串对象的创建方式有两种如下:String s1 = new String("");  //第一种String s2 = "";              //第二种第一种始终不会入池的.第二种要看情况而定(等号右边如果是常量则入池,非常量则不入池)例:String s3 = "a" + "b"; //"a"是常量,"b"是常量,常量+常量=常量,所以会入池.String s4 = s1 + "b";  //s1是变量,"b"是常量,变量+常量!=常量,所以不会入池.一旦入池的话,就会先查找池中有无此对象.如果有此对象,则让对象引用指向此对象;如果无此对象,则先创建此对象,再让对象引用指向此对象.例:String s5 = "abc"; //先在池中查找有无"abc"对象,如果有,则让s5指向此对象;如果池中无"abc"对象,则在池中创建一个"abc"对象,然后让s5指向该对象.