gpt4 book ai didi

java - Pattern.compile.split 与 StringBuilder 迭代和子字符串

转载 作者:行者123 更新时间:2023-12-01 08:11:17 24 4
gpt4 key购买 nike

我必须以尽可能最快的方式分割一个非常大的字符串,根据我所做的研究,我将其缩小到两种可能性:

1.Pattern.compile("[delimiter]").split("[large_string]");
2. 迭代StringBuilder并调用substring

StringBuilder sb = new StringBuilder("[large_string]");
ArrayList<String> pieces = new ArrayList<String>();
int pos = 0;
int currentPos;
while((currentPos = sb.indexOf("[delimiter]", pos)) != -1){
pieces.add(sb.substring(pos, currentPos));
pos = currentPos+"[delimiter]".length();
}

感谢任何帮助,我将对它们进行基准测试,但我对理论部分更感兴趣:为什么一个比另一个更快。

此外,如果您有其他建议,请发表。

更新:正如我所说,我已经完成了基准测试,生成了 500 万个字符串,每个字符串有 32 个字符,这些字符串被放入由 ~~ 分隔的单个字符串中:

    令人惊讶的是,
  1. StringBuilder 方法是最慢的,平均为 2.50-2.55 秒
  2. Pattern.compile.split 排名第二,平均时间为 2.47-2.49 秒
  3. Guava 的
  4. Splitter 是无可争议的获胜者,平均时间为 1.12-1.18 秒时间的一半(特别感谢 >fge是谁建议的)

谢谢大家的帮助!

最佳答案

如果您的字符串很大,则需要考虑是否制作任何副本。如果您不使用 StringBuilder,而是使用普通的 String#substring(from,to),则不会对字符串内容进行任何副本。整个字符串将有 1 个实例,并且只要至少有 1 个子字符串存在,它就会一直存在。

嗯...仔细阅读 Pattern 类的源代码表明 split 执行相同的操作,而 StringBuilder 的源代码显示为每个子字符串创建副本。

关于java - Pattern.compile.split 与 StringBuilder 迭代和子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17110376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com