2009-06-24 43 views
3

我最近發現java.lang.String.substring方法沒有返回一個新的字符串,而是一個被substringed的原始字符串的視圖。這可能會影響內存。例如,如果讀取ascii文件,並使用子字符串解析文件中的標記並將子字符串的結果存儲在內存中 - 實際上存儲在內存中的是子字符串操作之前的整個字符串!您當然可以通過在您自己的版本中包裝子字符串來解決這個問題,該子字符串返回子字符串結果的新字符串。有多少人被Java子串內存問題困擾了?

+1

問題是...? – Javier 2009-06-24 06:42:20

+0

如果你使用同一個字符串的多個子字符串,你實際上可以節省內存。 ;) – 2009-06-25 17:55:24

+0

實際上,這在Java 7的某些更新中發生了變化。現在,子串是副本。 – Thilo 2015-01-22 12:38:08

回答

11

我被它咬了一次,逐行閱讀字典文件。每行很短,但由BufferedReader創建的緩衝區意味着每個字符串都由80個字符的數組支持。

那是我第一次學會了寫作的一點:

word = new String(word); 

大部分它不是一個問題,但時間 - 當然它可以更有效率比「採取了完全獨立的副本「方法。

1

在2000年或2001年,早期的XML解析器之一(我不記得是哪個)遇到了這個問題。我們花了一段時間才通過閱讀早期FpML(描述金融產品的非常大的XML文檔)中的大約3個字段來追蹤我們如何走出內存。

什麼是真的很煩人的是,如果寫

String copy = new String(s); 

IntelliJ IDEA的警告我說,這是多餘的!愚蠢的IDE。