所以我知道java字符串是不可變的。 有一堆方法可以替換java中字符串中的字符。 因此,每次調用這些方法時,是否會涉及創建全新的String,因此增加了空間複雜度,或者將在原始String本身中完成替換。我對這個概念有點困惑,因爲這些代碼中的每個替換語句是否會每次都生成新的字符串,從而消耗更多的內存?是否每次在字符串上使用replaceAll()時都會創建一個新字符串?
回答
您正確指出,String
中的對象是不可變的。替換,子串等方法不創建新對象的唯一情況是替換爲空操作。例如,如果您要求替換"Hello, world!"
字符串中的所有'x'
字符,則不會創建新的String
對象。同樣,當您撥打str.substring(0)
時,將不會有新對象,因爲整個字符串都會返回。在所有其他情況下,當返回值與原始值不同時,會創建一個新對象。
我花了一段時間才發現'Hello world'中沒有'x'。那一刻我懷疑自己.. –
確實是will return a new String,但除非這個調用是一些巨型循環或遞歸函數的一部分,否則不必太擔心。
但是,如果你故意要讓你的系統崩潰,我相信你可以想出一些辦法。
@nachokk - 賞金 – Coffee
它們每次都會生成新的;這是不變的必然結果。
從某種意義上說,它增加了「空間複雜度」,因爲它使用更多的內存而不是最有效的替換算法,但並不像聽起來那麼糟糕;在replaceAll操作期間創建的瞬態對象以及其他類似的瞬態對象都會非常快速地被垃圾收集; java在垃圾收集瞬態對象方面非常高效。有關垃圾收集基礎知識的有趣書寫,請參閱http://www.infoq.com/articles/Java_Garbage_Collection_Distilled。
由於某種原因,JDK未執行字符序列的變異操作,即StringBuilder
未實現替換功能。
可能的選擇是使用第三方庫,即MutableString
。它是available in Maven Central。
是的。你已經注意到了。 String類型的不變性會帶來一些後果。
這就是爲什麼Java設計人員在用char序列執行操作時應該使用另一種類型的原因。
當您執行許多涉及字符操作(如替換)的操作時,應使用名爲StringBuilder的類。當然,它更強大,需要更多的關注細節,但這一切都是在你關心性能的時候。
因此,String類型的不變性不會增加內存使用量。什麼增加它是錯誤的字符串類型的使用。
- 1. 每次運行代碼時都會在字符串中添加一個字符
- 2. 每次都會返回字符串嗎?
- 3. 在Textview中每次調用類時都會增加字符串
- 4. 是否可以在replaceAll上使用字符串變量?
- 5. 字符串的replaceAll多個字符
- 6. Ruby:在每次更換時創建新字符串
- 7. 的Java:字符串的replaceAll另一個字符串
- 8. 如何使用JavaScript創建一個字符串的字符串?
- 9. 從舊的字符串創建一個新的字符串
- 10. 如何在每次創建新項目時創建新的字符串?
- 11. 拆分字符串每個X字符串都不起作用
- 12. 當在html.erb中使用每個字符串時,Rails會打印字符串
- 13. 爲字符串創建一個新行
- 14. C++:使用子字符串來創建一個新的字符串
- 15. 檢查一個字符串是否有元音,並創建一個新的字符串,使輔音加倍
- 16. 從另一個字符串中創建一個字符串?
- 17. 如何在PHP中使用每個字符都回顯一個字符串?
- 18. 一個字符串查找是否有另一個字符串
- 19. 搜索一個字符串是否另一個字符串
- 20. C - 檢查字符串是否是另一個字符串的子字符串
- 21. 在c中搜索一個字符串的子字符串,然後創建一個新的字符串
- 22. 爲什麼每個字符串都有空字符串?
- 23. 如何在python中創建一個字符串字符串
- 24. 創建在大熊貓字符串的每次出現新列
- 25. 如何使用字符串插值和逐字字符串一起創建一個JSON字符串文字
- 26. 如何用格式創建一個字符串?不在字符串上工作
- 27. 如何使用JavaScript循環一個長字符串以在每次匹配後插入一個新字符串
- 28. 爪哇 - 檢查是否字符串在另一個字符串
- 29. 這段代碼是否創建一個臨時字符串?
- 30. Java字符串的replaceAll()
'所以我知道java字符串是不可變的。 –
我不認爲你知道字符串[immutable](http://i.imgur.com/JYJycB4.jpg) – gtgaxiola
你對[String interning]是否熟悉(http://en.wikipedia.org/wiki/String_interning)? – MariuszS