如果我有一个Java代码段,例如:
String description = someFunctionCall();
anotherFunction( description.replace(",", " " ).replace( ".", " " ) );
创建了多少字符串以便以后进行垃圾回收,如何使多次替换更有效?
答案 0 :(得分:2)
String.replace(char,char)仅在实际发生替换时才创建新字符串。
如果你需要替换一组有限的字符,或者你需要为不同的输入字符使用不同的替换,那么你应该使用StringBuilder并使用StringBuilder.charAt()和StringBuilder.setCharAt()方法手动迭代它。个人的角色。除StringBuilder本身和生成的String之外,此方法不会创建任何其他对象。
您可以使用String.replaceAll(正则表达式,替换),甚至可以通过Pattern.compile(正则表达式)预编译正则表达式,然后重复使用Pattern对象,如pattern.matcher(inputString).replaceAll(replacement)。这种方法允许您在一次调用中执行替换,但它会在引擎盖下创建许多其他符合gc条件的对象。
答案 1 :(得分:0)
创建字符串对象取决于字符串中的可替换字符。
您可以使用replaceAll()
在一个语句中替换,
和.
。
description=description.replaceAll("[,.]","");
答案 2 :(得分:0)
为了有效,您应该使用description.replace(',', ' ' ).replace( '.', ' ' )
代替。然后,如果没有','或'。'在描述中不会创建新的String,否则replace会创建一个新的String。
description.replaceAll("[,]", " " )
将使用Pattern,并且会创建更多对象
答案 3 :(得分:0)
你可以使用replaceAll(regex,replacment); String的函数,它接受正则表达式并用提供的字符串替换所有出现的内容。它在堆中创建字符串并为您提供最后一个字符串(即输出)
请参考这个 Difference between , java string replace() and replaceAll()
答案 4 :(得分:0)
一旦您为String
分配了一个值,该值就永远不会改变 - 它是不可变的。
好消息是String对象是不可变的,它的引用变量是 不,所以继续你的代码:
1)VM取description
的值,用,
替换" "
给我们一个新值。
2)再次使用新字符串description
,用.
替换" "
给我们另一个新值。
由于字符串是不可变的,因此VM无法将此新值填充到引用的旧String中
按description
,因此它创建了一个新的String对象,为其赋予了新值,并使description
引用它。
此时我们将有3个对象,
第一个 - 我们创造了
第二个 - ,
替换为" "
第三个 - .
替换为" "