[英]java string replace and memory
如果我有一個Java代碼段,例如:
String description = someFunctionCall();
anotherFunction( description.replace(",", " " ).replace( ".", " " ) );
創建了多少個字符串以便以后進行垃圾回收?如何使多個替換更有效率?
String.replace(char,char)僅在替換確實發生時才創建新字符串。
如果需要替換一組有限的字符,或者需要為不同的輸入字符使用不同的替換字符,則應使用StringBuilder並使用StringBuilder.charAt()和StringBuilder.setCharAt()方法手動對其進行迭代,以替換單個字符。 除了StringBuilder本身和生成的String之外,此方法不會創建任何其他對象。
您可以使用String.replaceAll(regex,replace)或什至通過Pattern.compile(regex)預編譯正則表達式,然后像pattern.matcher(inputString).replaceAll(replacement)一樣重用該Pattern對象。 這種方法使您似乎可以在一次調用中執行替換,但是它將在引擎蓋下創建許多其他符合gc要求的對象。
字符串對象的創建取決於字符串中的可替換字符。
您可以使用replaceAll()
來代替,
和.
在一個聲明中。
description=description.replaceAll("[,.]","");
為了提高效率,您應該改用description.replace(',', ' ' ).replace( '.', ' ' )
。 然后,如果沒有“,”或“。” 在描述中,不會創建新的字符串,否則,替換將創建新的字符串。
description.replaceAll("[,]", " " )
將使用模式,並且將創建更多對象
您可以使用replaceAll(regex,replacment); String的功能,它使用正則表達式並將所有出現的內容替換為提供的字符串。 它在堆中創建字符串,並為您提供最后一個字符串(即輸出)
一旦為String
分配了一個值,該值就永遠不會改變-它是不可變的。
好消息是,盡管String對象是不可變的,但它的引用變量卻不是,因此繼續執行代碼:
1)VM取description
的值,
用" "
替換,
為我們提供一個新值。 2)再次使用新的字符串description
,代替.
用" "
為我們提供了另一個新的價值。
由於字符串是不可變的,因此VM無法將這個新值填充到description
引用的舊String中,因此它創建了一個新的String對象,為其提供了新值,並使description
引用了它。
此時,我們將有3個對象,
第一個-我們創建了第二個- ,
替換為" "
第三個- .
替換為" "
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.