所以我知道java字符串是不可变的。 有许多方法可以替换java中字符串中的字符。 因此,每次调用这些方法时,是否会涉及创建全新的String,从而增加空间复杂性,或者在原始String本身中进行替换。我对这个概念有点困惑,我的代码中的每个替换语句是否每次都会生成新的字符串,从而消耗更多的内存?
答案 0 :(得分:3)
您正确地注意到Java中的String
对象是不可变的。替换,子串等方法不创建新对象的唯一情况是替换是无操作时。例如,如果要求替换'x'
字符串中的所有"Hello, world!"
个字符,则不会创建新的String
个对象。同样,当您调用str.substring(0)
时,将没有新对象,因为返回了整个字符串。在所有其他情况下,当返回值与原始值不同时,将创建一个新对象。
答案 1 :(得分:1)
他们每次都会产生新的;这是不可改变的必然结果。
在某种意义上,它确实增加了“空间复杂度”,因为它使用的内存比最有效的替换算法更多,但它并没有听起来那么糟糕;在replaceAll操作期间创建的临时对象和其他类似的对象很快被垃圾收集; java在垃圾收集瞬态对象方面非常有效。有关垃圾收集基础知识的一些有趣文章,请参阅http://www.infoq.com/articles/Java_Garbage_Collection_Distilled。
答案 2 :(得分:1)
是。你已经正确地注意到了它。 String类型的不变性会产生一些后果。
这就是为什么Java的设计者带来了另一种在使用char序列执行操作时应该使用的类型。
当您执行涉及替换等字符操作的大量操作时,应使用名为StringBuilder的类。当然它更强大,需要更多关注细节,但这就是你关心性能的全部。
因此String类型的不变性不会增加内存使用量。增加错误使用String类型的原因是什么。
答案 3 :(得分:0)
确实它是will return a new String,但除非调用是某个巨型循环或递归函数的一部分,否则不必过于担心。
但是如果你故意想让你的系统崩溃,我相信你可以想一想。
答案 4 :(得分:0)
JDK错过了字符序列的变异操作,即StringBuilder
由于某种原因没有实现替换功能。
可能的选择是使用第三方库,即MutableString
。它是available in Maven Central。