String.substring vs String[].split



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

-duncan

由于String.Split返回string[],因此使用60向Split将导致每行约60个不必要的分配。Split遍历整个字符串,并创建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,而substring的1,000,000迭代仅为0.05s。那就是字符串中只有八个组件!六十个组件的区别将更加剧烈。

course为什么要通过整个字符串迭代,只需使用substring()indexOf()

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

  • .split()以字符串作为参数,但该字符串解释为Pattern,对于您的用例,Pattern是昂贵的;
  • 正如您所说,您只需要第二个元素:算法即可抓住第二个元素,足以通过手动进行操作。

我会使用以下内容:

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

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

不过,唯一的肯定方法是在特定情况下测试每种方法。打破适当的秒表并测量两个。

最新更新