最经在看一些面试题:
有个问题居然两种答案:String s = new String("xyz");创建了几个String Object: 1   两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s
2   两个对象,一个是String Pool里的“xyx”,一个是堆里的“xyx”对象,而s仅是个引用不是对象我个人感觉第二个答案比较正确,希望大家给我个准确的答案!

解决方案 »

  1.   

    1string是不可改变的,而且存在string对象池。
    所以不可能既在string pool里有一个而且在所谓的堆里也有一个!
      

  2.   

    s这个引用指向堆里面的一个对象
    然后在串池里面有一个对象是 "xyz"
      

  3.   


    有问题~String 在pool中有,new的话会在外边再创建。1楼对的。
      

  4.   

    String str1 = new String("abc");     
    Stirng str2 = "abc";        虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。对于第一种,jvm会马上在heap中创建一个String对象,然后将该对象的引用返回给用户。对于第二种,jvm首先会在内部维护的strings pool中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法.
      

  5.   

    2正确,引用不是对象。string池中有的话,就只是创建一个对象
      

  6.   

    不就是把xyz这个数值给了s这个对象了吗
      

  7.   

    2正确,引用不是对象,这必须要明确的信条:)
    我也对这个问题进行了些整理,如果LZ对String对象操作还有疑惑,可以看看我整理的一篇文章:
    http://hi.csdn.net/link.php?url=http://blog.csdn.net%2Ffengyud
      

  8.   

    public String(String original) {
    int size = original.count;
    char[] originalValue = original.value;
    char[] v;
       if (originalValue.length > size) {
          // The array representing the String is bigger than the new
          // String itself.  Perhaps this constructor is being called
          // in order to trim the baggage, so make a copy of the array.
                int off = original.offset;
                v = Arrays.copyOfRange(originalValue, off, off+size);
      } else {
          // The array representing the String is the same
          // size as the String, so no point in making a copy.
        v = originalValue;
      }
    this.offset = 0;
    this.count = size;
    this.value = v;
        }从我对源码的分析,
    String s = new String("abc");
    创建了两对象,new String对象是"abc"对象的浅拷贝,
    java中对字符串字面值都是String实例.所以创建了两对象,先创建abc对象并加开池中,再浅拷贝一个对象,再返回此对象的引用给s,s在堆中,new String在栈中,池在那里,我还没想明白,