JDK6和JDK7 String.substring()区别

  1. substring(int beginIndex,int endIndex) 返回此对象的一个子串,从beginIndex开始到endIndex结束。
  2. JDK6中的substring()
    先来看一下源码:
String(int offset, int count, char value[]) {
    this.value = value;
    this.offset = offset;
    this.count = count;
}
 
public String substring(int beginIndex, int endIndex) {
    return  new String(offset + beginIndex, endIndex - beginIndex, value);
}

String类包含三个成员变量:char value[], int offset,int count。
value:真正的字符数组
offset:数组中的第一个位置索引(从0开始)
count:包含的字符个数
调用substring()时,会创建一个新的String数组,但是这个string指向堆中同一个字符数组,两个对象只有count和offset不同。

jdk6 substring().png

产生问题:当一个非常长的字符串,每次substring()时只需要很小的一部分,却会引用整个value[]数组,导致大量内存被占用
JDK 6中,一般用以下方式来解决该问题。原理:生成一个新的字符串并引用它。

x = x.substring(x, y) + ""
  1. JDK7 对sunstring()的优化
    substring()方法在堆内存中创建了另一个字符数组.


    jdk7 substring().png

JDK7substring源码:

public String(char value[], int offset, int count) {
    // value 数组拷贝  
    this.value = Arrays.copyOfRange(value, offset, offset + count);
}
 
public String substring(int beginIndex, int endIndex) {
    int subLen = endIndex - beginIndex;
    return new String(value, beginIndex, subLen);
}

使用new String创建了一个新字符串,避免对老字符串的引用。从而解决了内存泄露问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容