簡體   English   中英

Java 使用 StringBuilder/StringWriter/String.format() 附加大字符串時出現 OutofMemoryException

[英]Java OutofMemoryException while appending large String using StringBuilder/StringWriter/String.format()

我正在嘗試解決一個編程問題,其中我正在處理一個大型字符串,我嘗試使用 String、StringBuilder 但在附加字符串時出現 OutOfMermoryException Java 堆空間。 當嘗試使用帶有 String.format() 的 StringWriter 時,運行程序需要很長時間(超過 15 分鍾)。

請建議當 String 的長度為 736778906400L 時可以使用什么我已附上代碼(git-repo)

如果您只需要計算重復字符串中的字符 - 計算它:

   static long repeatedString(String s, long n) {
        final char charToCheck='a';
        if (s.indexOf(charToCheck)>=1) {
            return s.chars()
                    .filter(value -> value == (int)charToCheck)
                    .count()*n;
        } else
            return 0;
    }

正如@Erwin Bolwidt 和其他人指出的那樣,StringBuffer 不適用於高於 int 最大值的值,並且還取決於 VM 可用的 memory。 您的程序也可能在該限制之前的某個階段或其他階段達到 OutOfMemory,因為 StringBuffer.append 的工作原理是重新分配一個更大的字符並在達到當前緩沖區大小時復制字符,因此您必須為 2 個巨大的字符串留出空間memory 一次。

您可以通過使用構造函數“new StringBuffer(int someLength)”使用您想要的字符數 append 使infiniteString() presize 來解決一些問題,這樣可以避免在初始預調整大小后重新分配內部緩沖區。

如果此時您已經避免了 OOM,infiniteString.toCharArray() 行也會復制緩沖區。 如果你讓infiniteString() 返回它的StringBuffer,你可以在循環字符而不是char[] 時調用sb.charAt 和sb.length

每次調用 String.valueOf(StringBuilder) 都會復制緩沖區,這可能會加快 OOM 的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM