你自己看看String的所有构造实现吧:
    public String() {
        value = new char[0];
    }
    public String(String original) {
  this.count = original.count;
  if (original.value.length > this.count) {
      // 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.
      this.value = new char[this.count];
      System.arraycopy(original.value, original.offset,
       this.value, 0, this.count);
  } else {
      // The array representing the String is the same
      // size as the String, so no point in making a copy.
      this.value = original.value;
  }
    }
    public String(char value[]) {
        this.count = value.length;
        this.value = new char[count];
        System.arraycopy(value, 0, this.value, 0, count);
    }    public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count < 0) {
            throw new StringIndexOutOfBoundsException(count);
        }
        // Note: offset or count might be near -1>>>1.
        if (offset > value.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }        this.value = new char[count];
        this.count = count;
        System.arraycopy(value, offset, this.value, 0, count);
    }    public String(byte ascii[], int hibyte, int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count < 0) {
            throw new StringIndexOutOfBoundsException(count);
        }
        // Note: offset or count might be near -1>>>1.
        if (offset > ascii.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }        char value[] = new char[count];
        this.count = count;
        this.value = value;        if (hibyte == 0) {
            for (int i = count ; i-- > 0 ;) {
                value[i] = (char) (ascii[i + offset] & 0xff);
            }
        } else {
            hibyte <<= 8;
            for (int i = count ; i-- > 0 ;) {
                value[i] = (char) (hibyte | (ascii[i + offset] & 0xff));
            }
        }
    }    public String(byte ascii[], int hibyte) {
        this(ascii, hibyte, 0, ascii.length);
    }    public String(byte bytes[], int offset, int length, String charsetName)
throws UnsupportedEncodingException
    {
if (charsetName == null)
    throw new NullPointerException("charsetName");
checkBounds(bytes, offset, length);
value = StringCoding.decode(charsetName, bytes, offset, length);
count = value.length;
    }    public String(byte bytes[], String charsetName)
throws UnsupportedEncodingException
    {
this(bytes, 0, bytes.length, charsetName);
    }    public String(byte bytes[], int offset, int length) {
checkBounds(bytes, offset, length);
value = StringCoding.decode(bytes, offset, length);
count = value.length;
    }    public String(byte bytes[]) {
this(bytes, 0, bytes.length);
    }    public String (StringBuffer buffer) {
        synchronized(buffer) {
            buffer.setShared();
            this.value = buffer.getValue();
            this.offset = 0;
            this.count = buffer.length();
        }
    }    // Package private constructor which shares value array for speed.
    String(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
    }