String.substring vs String [] .split

时间:2012-12-21 21:22:11

标签: java memory garbage-collection

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

-Duncan

5 个答案:

答案 0 :(得分:29)

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

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

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);

以上prints brown

当您多次运行时,substring按时获胜:{1,000}次split次迭代需要3.36秒,而substring次1,000,000次迭代仅需0.05秒。这就是字符串中只有八个组件!六十个组成部分的差异将更加激烈。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

由于两个原因,你最好手工完成:

  • .split()将字符串作为参数,但此字符串被解释为Pattern,而您的用例Pattern代价很高;
  • 如你所说,你只需要第二个元素:抓住第二个元素的算法很简单,可以手工完成。

答案 3 :(得分:2)

我会使用类似的东西:

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

答案 4 :(得分:1)

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

但是,确定的唯一真正方法是在特定情况下测试每个方法。打破适当的秒表并测量两者。