创建了两个,看一下source code就知道了,做了一次array copy

解决方案 »

  1.   

    错了应该说运行期创建了一个,编译期创建了一个.
    固定字符串在编译期会被放入string pool
      

  2.   

    请问zhengkan,我怎么才能看到source code呢?
      

  3.   

    请问zhengkan,固定字符串在编译期会被放入string pool,那么假如我这么写呢?
         String s1 = "xyz";
         String s2 = s1;
         s1 = "abc";
    是不是可以理解成第一步创建了一个String object,然后这个对象放入了String pool;第二步将地址的拷贝赋值给了变量s2;第三步是又创建了一个String object,s1指向了这个新对象?
      

  4.   

    二个,new String("xyz");产生一个临时的string对像,然后系统根据s重载的=运算符再次产生一个String对像
      

  5.   

    根据zhang9652的意思,String s = new String("xyz")是产生了2个,那么如果分成2句来写,
    String s1 = "xyz";//这是产生第一个
    String s2 = s1;  
    这样是否只产生了一个呢?String重载的=运算符内部是什么机制呢?
      

  6.   

    jdk\src.zip\java.lang.String.javasometimes src.zip is src.jar
      

  7.   

    其实字符串的=操作没什么特别的,就是把地址赋值过去,String是一个对象,产生的变量必然是一个引用。明白这个你就明白String了:
    String s1 = "xyz";
    String s2 = "xyz";
    String s3 = "x" + "yz";
    System.out.println(s1 == s2);
    System.out.println(s1 == s3);
      

  8.   

    楼上dx,我理解这样的话打印出来应该是两个false,怎么是两个true呢?
    也就是说,java会找到现有的内容相同的字符串对象,然后把地址进行
    赋值吗?
      

  9.   

    ^_^。
    是一个字符串的refenrence.
    ^_^
      

  10.   

    这就是String pool,在编译期做好的东西,呵呵
      

  11.   

    同意zhengkan,java 处理字符串时用了一个String pool.当创建一个新的String Object时,首先会在String pool中查找是否内相同的String,如果有,就只是引用一个地址,所以在用“==”比较时的结果是true.
      

  12.   

    按照楼上的意见,那么此时==和equals是相同的作用。那么java是怎么维护String pool呢?为什么很多时候==和equals又是不同的结果呢?
      

  13.   

    String 即可以看做字副串变量,有可以看做一个类,当然只创建一个