博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Subtring方法在JDK6 和JDK7

Posted on 2014-04-19 23:20  钟悍  阅读(845)  评论(0编辑  收藏  举报

1, subtring在JDK6中:

String是有字符数组组成的,在JDK6中,String 类包含3个属性,char value[], int offset, int count. 它们被用作存储真正的字符数组,数组的第一个索引,String中字符的个数。

当调用substring()方法时,将创建一个新的字符串,但是字符串的值仍旧是指向堆中相同的字符数组,这两个字符串所不同的是他们的count和offset的值。

下面的代码简单的并且之包含重点的解释这这个问题。

//JDK 6
String(int offset, int count, char value[]) {
    this.value = value;
    this.offset = offset;
    this.count = count;
}
 
public String substring(int beginIndex, int endIndex) {
    //check boundary
    return  new String(offset + beginIndex, endIndex - beginIndex, value);
}

2, JDK6中substring方法存在的问题。

如果你有一个非常长的字符串,但是你仅仅需要这个字符串的一小部分,然而使用substring时,这将导致性能问题,既然你只想要一小部分,你却保存了这个thing。在JDK6中,使用如下的解决方案解决这个问题:

x = x.substring(x, y) + ""

3,JDK7中substring方法

在JDK7中substring得到了改进,substring方法实际上在堆中创建了一个新的字符数组。

//JDK 7
public String(char value[], int offset, int count) {
    //check boundary
    this.value = Arrays.copyOfRange(value, offset, offset + count);
}
 
public String substring(int beginIndex, int endIndex) {
    //check boundary
    int subLen = endIndex - beginIndex;
    return new String(value, beginIndex, subLen);
}