簡體   English   中英

java字符串替換和內存

[英]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的功能,它使用正則表達式並將所有出現的內容替換為提供的字符串。 它在堆中創建字符串,並為您提供最后一個字符串(即輸出)

請參考Java字符串replace()和replaceAll()之間的區別

一旦為String分配了一個值,該值就永遠不會改變-它是不可變的。

好消息是,盡管String對象是不可變的,但它的引用變量卻不是,因此繼續執行代碼:

1)VM取description的值," "替換,為我們提供一個新值。 2)再次使用新的字符串description ,代替. " "為我們提供了另一個新的價值。

由於字符串是不可變的,因此VM無法將這個新值填充到description引用的舊String中,因此它創建了一個新的String對象,為其提供了新值,並使description引用了它。

此時,我們將有3個對象,

第一個-我們創建了第二個- ,替換為" "第三個- . 替換為" "

暫無
暫無

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

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