美文网首页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