日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK6和JDK7中String的substring()方法及其差异

發布時間:2024/8/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK6和JDK7中String的substring()方法及其差异 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
翻譯人員: 鐵錨
翻譯日期: 2013年11月2日
原文鏈接: The substring() Method in JDK 6 and JDK 7?
?
在JDK6與JDK7這兩個版本中,substring(int beginIndex, int endIndex)方法是不同的. 了解兩個版本間的區別可以讓你更好地使用它們. 為簡單起見,本文中以 substring() 表示 substring(int beginIndex, int endIndex).

1. substring()功能簡介
String對象的substring(int beginIndex, int endIndex)方法返回此對象的一個子串,從beginIndex 開始,一直到 endIndex-1 結束,共 (endIndex - beginIndex)個字符。
新手提示:?
? ? 1.1 String 的索引和數組一樣,都是從0開始.
? ? 1.2 注意,方法名字是substring(),全小寫.
? ? 1.3 有個重載方法是substring(int beginIndex),從beginIndex索引處開始,取得子字符串.

String x = "abcdef"; int begin=1; int end=3; x = x.substring(begin, end); System.out.println(x);
執行結果(包含索引為 begin,直到 end-1 的字符):

bc
2. 當substring()被調用時,發生了什么?
你應該知道,因為 x 是不可變的,當 指定 x 等于 x.substring(begin, end)時,實際上 x 指向了一個全新的字符串,如下圖所示:

圖1



然而,這幅圖并不是完全正確的,堆內存中所真正發生的事也不是這么簡單.那么,在JDK6和JDK7之間 substring()的調用到底有些什么區別呢?

3. JDK 6中的substring()方法
String實際上是一個字符數組.在 JDK6中, String對象主要包含3個屬性域:?
private final char value[]; private final int offset; private final int count;
他們用于存儲實際的字符數組,數組的第一個索引,以及String的字符個數.
當調用 substring() 方法時,創建了一個新的String對象,但是string的value[] 屬性域仍然指向堆內存中的原來的那個數組。區別就是 兩個對象的 count 和 offset 這兩個值不同了。 如下圖所示:

圖2 要解釋這個問題,下面是最關鍵部分的代碼:
// JDK6,包級私有構造,共享 value數組提升速度 String(int offset, int count, char value[]) {this.value = value;this.offset = offset;this.count = count; }public String substring(int beginIndex, int endIndex) {// ... 檢查邊界的代碼// 如果范圍和自己一模一樣,則返回自身,否則用value字符數組構造一個新的對象return ((beginIndex == 0) && (endIndex == count)) ? this :new String(offset + beginIndex, endIndex - beginIndex, value); }
4. JDK 6中substring()引起的問題
如果有一個" 非常"長的字符串,但每次使用substring()時只想要很小的一部分,那么將會引起另一個性能問題: 雖然你只需要很小的一部分,但是持有了整個value[]的引用,從而導致大量內存被占用。
要解決這個問題,在JDK6中可以讓其指向一個真正的子字符串,示例代碼:
x = x.substring(begin, end) + "";
5. JDK 7中的substring()方法
在JDK 7 中這個問題得到改進, substring()方法真實地在堆內存中創建了另一個字符數組.

圖3
// JDK 7, 權限變為 public 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 ((beginIndex == 0) && (endIndex == value.length)) ? this: new String(value, beginIndex, subLen); }
參考:

1. Changes to substring?

2. Java 6 vs Java 7 when implementation matters

相關閱讀:

1. Top 10 questions about Java String.

2. Java method for spliting a camelcase string

3. Java: Convert File to Char Array

4. Count Number of Statements in a Java Method By Using Eclipse JDT ASTParser


總結

以上是生活随笔為你收集整理的JDK6和JDK7中String的substring()方法及其差异的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。