2012-02-10 42 views
1

在閱讀關於字符串的android文檔之後,其中包括:StringBuilder.substring(..)是否創建一個新的char []?

此類使用char []實現。該數組的長度可能會超過字符串的長度 。例如,字符串「Hello」可能由數組['H','e','l','l','o','W')支持。 'o','r','l', 'd'],偏移量爲0,長度爲5.

多個字符串可以共享同一個char [],因爲字符串是 不可變的。 substring(int)方法總是返回一個字符串,該字符串共享其源字符串的後備數組。通常這是一個 優化:需要分配更少的字符數組,並且需要更少的複製 。但是這也可能導致不必要的堆保留。採用長字符串的短子串意味着在兩個字符串都是垃圾之前,共享字符串[]不會被垃圾回收。這個 通常發生在從一個大輸入中解析小的子串時。 爲了避免這種情況發生,請致電新的 String(longString.subString(...))。字符串複製構造函數總是 可確保後備數組的大小不超過必要的大小。

所以我的問題是:當我們創建一個String作爲StringBuilder的子串時會發生什麼?是否還有任何內存方面的考慮? 這導致我的另一個問題: 組合StringBuilder /字符串是一個很好的選擇,當選擇大型文本的小部分和編程時考慮到快速性考慮?

謝謝你的關注和你的時間,祝你有美好的一天!

回答

2

這裏:AbstractStringBuilder.substring(int, int)(StringBuilder擴展了這個類)在OpenJDK中完全描述了你的代碼片段:創建一個新的字符串以避免保留整個字符串的內存子字符串被調用。讓我們希望的Dalvik的實現是一樣的:)

其實,你的想法如何檢查,這裏有如何讓Dalvik的來源說明:http://source.android.com/source/downloading.html

+0

我對 [鏈接](HTTP去://javasourcecode.org/html/open-source/jdk/jdk-6u23/java/lang/AbstractStringBuilder.java.html) 看到源代碼,我們可以看到返回的字符串是這樣創建的: 「返回新的字符串(值,開始,結束 - 開始)」 根據android文檔確實導致一個新的char []正在創建這個字符串。 感謝您的幫助! – 2012-02-10 22:00:32

+0

太棒了,不客氣。現在我也知道了:) – 2012-02-10 22:21:35

相關問題