我想使用StringBuilder之类的东西来保存一个字符串,然后以一种有效的方式对其执行大量的regex replaceAll操作。我想利用StringBuilder的可变大小数组并防止临时字符串分配。也就是说,我希望regex replaceAll操作可以根据需要更改StringBuilder拥有的数组,而无需分配临时字符串。我该怎么办?
不幸的是,StringBuilder没有内置方法来执行此操作。它只有一个不带正则表达式的replace()方法,我看不到一种方法,而不必使用Matcher用新分配的String有效地替换整个StringBuilder缓冲区,我想避免这种情况。
答案 0 :(得分:1)
正则表达式不会创建额外的字符串。它会验证字符串是否匹配(或不匹配)模式。
捕获组返回字符串,但是Java中的字符串不是可变的,因此您不能让它们用可变的存储区域或什至是可变的存储区域的一部分来表示。
此外,Regex操作不是一步(即使它似乎在代码中),而是运行以字符串作为输入的状态机。 Java是多线程的,并且如果在机器上运行数据时对其进行修改,则状态机将无法正常工作。要解决此问题,需要锁定缓冲区,这会产生额外的开销。
在锁的开销和具有其他String对象的开销之间,锁的开销将使维护两个不变对象的开销为负。简而言之,与没有十几个(甚至可能一百个)额外的字符串所节省的时间相比,您花费更多的cpu周期来获得锁定。
最后,整个JVM包含特定于字符串的优化。如果您想要一个可变的字符串,那么这些优化将不起作用,并且会导致JVM中一种更常用的数据类型出现奇怪的行为。