Java 是否每次对字符串使用replaceAll()时都会创建一个新字符串?

Java 是否每次对字符串使用replaceAll()时都会创建一个新字符串?,java,Java,所以我知道java字符串是不可变的。 在java中,有许多方法可以替换字符串中的字符。 因此,每次调用这些方法时,它会涉及创建一个全新的字符串,从而增加空间复杂性,还是会在原始字符串本身中进行替换。我对这个概念有点困惑,我的代码中的每个replace语句是否每次都会生成新字符串,从而消耗更多内存 您正确地注意到Java中的String对象是不可变的。替换、子字符串等方法不创建新对象的唯一情况是替换为不可操作。例如,如果您要求替换“Hello,world!”字符串中的所有'x'字符,则不会创建新的

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

您正确地注意到Java中的
String
对象是不可变的。替换、子字符串等方法不创建新对象的唯一情况是替换为不可操作。例如,如果您要求替换
“Hello,world!”
字符串中的所有
'x'
字符,则不会创建新的
字符串
对象。类似地,在调用
str.substring(0)
时也不会有新对象,因为返回的是整个字符串。在所有其他情况下,当返回值与原始值不同时,将创建一个新对象。

的确如此,但除非调用是某个大循环或递归函数的一部分,否则不必太担心


但是,如果你故意想破坏你的系统,我相信你可以想出一些办法。

他们每次都会生成新的;这是不变的必然结果


从某种意义上说,它确实增加了“空间复杂性”,因为它比最有效的算法使用更多的内存进行替换,但它并不像听起来那么糟糕;replaceAll操作期间创建的临时对象和其他类似对象会很快被垃圾收集;java在垃圾收集瞬态对象方面非常有效。有关一些垃圾收集基础知识的有趣说明,请参阅。

JDK未命中字符序列的变异操作,即由于某种原因,
StringBuilder
未实现替换功能


一个可能的选择是使用第三方库,即。是的。

是的。你记对了。字符串类型的不变性有一些后果

这就是为什么Java的设计者带来了另一种类型,当您使用字符序列执行操作时应该使用这种类型

当您执行许多涉及字符操作(如replace)的操作时,应该使用名为的类。当然,它更健壮,需要更多地关注细节,但这就是您关心性能的全部


因此字符串类型的不变性不会增加内存使用。增加的是字符串类型的错误使用

所以我知道java字符串是不可变的
。我想你不知道你熟悉的字符串吗?每次调用replace()或replaceAll()时,都会创建大量字符串和其他对象,因为它们在内部调用了大量正则表达式引擎,即使对于非正则表达式搜索文本也是如此。P.S.replaceAll()是一个正则表达式方法。对非正则搜索文本使用replace()(它会替换所有匹配项)。这些方法的名称很愚蠢。你为什么不自己测试一下,这样你就可以相信了<代码>字符串s=“你好,硝基。”;字符串t=s.replaceAll(“硝基”、“尼龙搭扣”);系统输出打印项次我花了一段时间才发现“Hello world”中没有“x”。有那么一会儿,我怀疑自己。。