19

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

-邓肯

4

5 回答 5

40

由于String.Split返回 a 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);

以上印刷品 brown

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

于 2012-12-21T21:24:41.140 回答
4

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

于 2012-12-21T21:23:46.087 回答
3

您当然最好手工完成,原因有两个:

  • .split()将字符串作为参数,但该字符串被解释为 a Pattern,并且对于您的用例Pattern而言成本很高;
  • 正如你所说,你只需要第二个元素:抓取第二个元素的算法很简单,可以手动完成。
于 2012-12-21T21:25:29.843 回答
2

我会使用类似的东西:

final int first = searchString.indexOf(",");
final int second = searchString.indexOf(",", first+1);
String result= searchString.substring(first+1, second);
于 2012-12-21T21:28:06.763 回答
1

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

但是,唯一能确定的真正方法是在您的特定场景中测试每一个。打破适当的秒表并测量两者。

于 2012-12-21T21:24:28.427 回答