美文网首页APP & program
JDK6和JDK7 String.substring()区别

JDK6和JDK7 String.substring()区别

作者: 糯米团子123 | 来源:发表于2022-07-15 13:57 被阅读0次
  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创建了一个新字符串,避免对老字符串的引用。从而解决了内存泄露问题。

相关文章

网友评论

    本文标题:JDK6和JDK7 String.substring()区别

    本文链接:https://www.haomeiwen.com/subject/xdmqirtx.html