【问题标题】:String.substring vs String[].splitString.substring 与 String[].split
【发布时间】:2012-12-09 11:02:29
【问题描述】:

我有一个逗号分隔字符串,当调用String.split(",") 时,它返回一个大小约为 60 的数组。在特定用例中,我只需要获取将从数组返回的第二个值的值。因此,例如"Q,BAC,233,sdf,sdf," 我想要的只是第一个',' 之后和第二个',' 之前的字符串值。我对性能的问题是我最好自己使用 substring 或使用 split 方法解析它,然后获取数组中的第二个值?任何输入将不胜感激。这种方法每秒会被调用数百次,因此我了解有关性能和内存分配的最佳方法很重要。

-邓肯

【问题讨论】:

  • 对其进行分析。期间。
  • 我的分析器的问题是我不知道我在分析器中看到的所有 char[] 数组来自哪里。对此进行分析并获取指标的用例是什么?
  • 我的意思不是描述创建的字符数组的数量。分析在“优化”之前和之后执行一个有点现实的基准测试所需的时间,看看它是否有任何明显的差异。

标签: java memory garbage-collection


【解决方案1】:

由于String.Split 返回string[],使用60 路Split 将导致每行大约有60 个不必要的分配。 Split 遍历整个字符串,并创建 60 个新对象以及数组对象本身。在这 61 个对象中,您只保留一个,让垃圾收集器处理剩下的 60 个。

如果你在一个紧密的循环中调用它,一个子字符串肯定会更有效:它遍历你的字符串部分直到第二个逗号,,然后创建一个你保留的新对象。

String s = "quick,brown,fox,jumps,over,the,lazy,dog";
int from = s.indexOf(',');
int to = s.indexOf(',', from+1);
String brown = s.substring(from+1, to);

以上printsbrown

当您多次运行此程序时,substring 会按时获胜:split 的 1,000,000 次迭代需要 3.36 秒,而 substring 的 1,000,000 次迭代只需 0.05 秒。这就是字符串中只有八个组件!六十个组件的差异会更大。

【讨论】:

  • 当然,假设它实际上对性能至关重要,并且您无法通过其他方式获得更高的速度。程序员倾向于对此做出非常不准确的猜测。
  • 感谢所有答案。好像主题是子字符串,你解释得最好。
  • 我写了一个方法来检索所需索引处的令牌,pastebin.com/R9Z6uW6H
【解决方案2】:

我会使用类似的东西:

final int first = searchString.indexOf(",");
final int second = searchString.indexOf(",", first+1);
String result= searchString.substring(first+1, second);

【讨论】:

  • 谢谢,将索引值声明为最终值的目的是什么?
  • 这只是我习惯的代码约定。我使所有变量 final 只分配一次。
  • 谢谢你的支持!请投票支持我想突破 600 的问题!
【解决方案3】:

出于两个原因,您当然最好手动操作:

  • .split() 将字符串作为参数,但该字符串被解释为 Pattern,而对于您的用例,Pattern 成本很高;
  • 正如您所说,您只需要第二个元素:抓取该第二个元素的算法非常简单,可以手动完成。

【讨论】:

    【解决方案4】:

    我的第一个倾向是找到第一个和第二个逗号的索引并获取子字符串。

    不过,唯一可以确定的真正方法是在您的特定场景中测试每一个。拿出适当的秒表并测量两者。

    【讨论】:

      【解决方案5】:

      当然为什么要遍历整个字符串,只需使用substring()indexOf()

      【讨论】:

      • 可能会出现一个错误?不太明显的代码数量增加了?
      猜你喜欢
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2022-12-02
      相关资源
      最近更新 更多