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