每次在String上使用replaceAll()时都会创建一个新字符串吗?

时间:2014-01-13 18:28:17

标签: java

所以我知道java字符串是不可变的。 有许多方法可以替换java中字符串中的字符。 因此,每次调用这些方法时,是否会涉及创建全新的String,从而增加空间复杂性,或者在原始String本身中进行替换。我对这个概念有点困惑,我的代码中的每个替换语句是否每次都会生成新的字符串,从而消耗更多的内存?

5 个答案:

答案 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