菜鳥譯文(三)——JDK6和JDK7中substring()方法的對比

substring(int beginIndex, int endIndex)方法在JDK6和JDK7中是不一樣的。瞭解他們的區別能夠讓咱們更好的使用這個方法。方便起見,如下用substring() 代替 substring(int beginIndex, int endIndex)。數組

 

1. substring()作了什麼?性能

substring(int beginIndex, int endIndex)方法返回一個以beginIndex開頭,以endIndex-1結尾的String對象。this

 

String x ="abcdef";

x =x.substring(1,3);

System.out.println(x);

 

輸出: spa

bc


 

2.當substring()被調用的時候發生了什麼? code

也許你以爲,由於x是不可變的,當x通過substring(1,3)處理之後,會指向以下一個全新的String對象: 對象

然而,這張圖沒有正確的表示出堆內存裏真正發生了什麼。那麼當調用substring()方法時,JDK6和JDK7究竟有什麼不一樣呢。 blog

 

3. JDK 6中的substring() 內存

String是由一個字符數組實現的,在JDK6中,String類由三部分組成:charvalue[], int offset, int count.。他們纔是真正用來存儲字符的數組,數組的第一個元素用來存儲字符的長度。 字符串

 

當調用substring()方法時,會建立一個新的String對象,可是這個String對象的值仍然指向堆內存中相同的數組。真正不一樣的是它們的計數和偏移量。 string

下面的代碼已經作了簡化,只包含解釋這一問題的關鍵部分。

//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);

}

 


4.JDK 6中的substring()存在的一個問題

若是有一個很是長的String對象,可是你每次經過substring()只用到其中一小部分。這樣就會有一個性能上的問題,對於JDK6來講,使用如下代碼能夠解決這個問題,這樣作會建立一個真正的子字符串對象:

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


5. JDK 7中的substring()

在JDK7中,substring()方法實際上會在堆內存中建立一個新的數組,這是JDK7中的一項改進。

 

//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);

}

 

 

原文地址:

http://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/

相關文章
相關標籤/搜索