2014-01-13 27 views
5

所以我知道java字符串是不可變的。 有一堆方法可以替換java中字符串中的字符。 因此,每次調用這些方法時,是否會涉及創建全新的String,因此增加了空間複雜度,或者將在原始String本身中完成替換。我對這個概念有點困惑,因爲這些代碼中的每個替換語句是否會每次都生成新的字符串,從而消耗更多的內存?是否每次在字符串上使用replaceAll()時都會創建一個新字符串?

+15

'所以我知道java字符串是不可變的。 –

+5

我不認爲你知道字符串[immutable](http://i.imgur.com/JYJycB4.jpg) – gtgaxiola

+0

你對[String interning]是否熟悉(http://en.wikipedia.org/wiki/String_interning)? – MariuszS

回答

3

您正確指出,String中的對象是不可變的。替換,子串等方法不創建新對象的唯一情況是替換爲空操作。例如,如果您要求替換"Hello, world!"字符串中的所有'x'字符,則不會創建新的String對象。同樣,當您撥打str.substring(0)時,將不會有新對象,因爲整個字符串都會返回。在所有其他情況下,當返回值與原始值不同時,會創建一個新對象。

+2

我花了一段時間才發現'Hello world'中沒有'x'。那一刻我懷疑自己.. –

0

確實是will return a new String,但除非這個調用是一些巨型循環或遞歸函數的一部分,否則不必太擔心。

但是,如果你故意要讓你的系統崩潰,我相信你可以想出一些辦法。

+0

@nachokk - 賞金 – Coffee

1

它們每次都會生成新的;這是不變的必然結果。

從某種意義上說,它增加了「空間複雜度」,因爲它使用更多的內存而不是最有效的替換算法,但並不像聽起來那麼糟糕;在replaceAll操作期間創建的瞬態對象以及其他類似的瞬態對象都會非常快速地被垃圾收集; java在垃圾收集瞬態對象方面非常高效。有關垃圾收集基礎知識的有趣書寫,請參閱http://www.infoq.com/articles/Java_Garbage_Collection_Distilled

0

由於某種原因,JDK未執行字符序列的變異操作,即StringBuilder未實現替換功能。

可能的選擇是使用第三方庫,即MutableString。它是available in Maven Central

1

是的。你已經注意到了。 String類型的不變性會帶來一些後果。

這就是爲什麼Java設計人員在用char序列執行操作時應該使用另一種類型的原因。

當您執行許多涉及字符操作(如替換)的操作時,應使用名爲StringBuilder的類。當然,它更強大,需要更多的關注細節,但這一切都是在你關心性能的時候。

因此,String類型的不變性不會增加內存使用量。什麼增加它是錯誤的字符串類型的使用。

相關問題