JDK6:

1.  public String substring(int beginIndex, int endIndex) {
2.      //check boundary
3.      return new String(offset + beginIndex, endIndex - beginIndex, value);
4.  }

6.  String(int offset, int count, char value[]) {
7.      this.value = value;
8.      this.offset = offset;
9.      this.count = count;
10.  }

JDK7:

1.  public String substring(int beginIndex, int endIndex) {
2.      //check boundary
3.      int subLen = endIndex - beginIndex;
4.      return new String(value, beginIndex, subLen);
5.  }

7.  public String(char value[], int offset, int count) {
8.      //check boundary
9.      this.value = Arrays.copyOfRange(value, offset, offset + count);
10.  }

差别就在于:

JDK6中子串指向的还是父串,只是位置有所不同,这在父串很长同时父串并没有再被使用的情况下,是对内存的消耗。

JDK7中则是copy生成了一个新的array来指向子串,copyOfRange主要是调用了System中的arraycopy方法,这个方法是native的。