我有一个逗号分层字符串,当调用String.split(",")
时,它返回的数组大小约为60.在特定用例中,我只需要获取从数组返回的第二个值的值。因此,例如"Q,BAC,233,sdf,sdf,"
我想要的是第一个','
之后和第二个','
之前的字符串的值。我对性能的问题是我最好使用子字符串或使用split方法解析它,然后获取数组中的第二个值?任何输入将不胜感激。这种方法每秒会被调用数百次,因此我理解有关性能和内存分配的最佳方法非常重要。
-Duncan
答案 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)
我的第一个倾向是找到第一个和第二个逗号的索引并获取子字符串。
但是,确定的唯一真正方法是在特定情况下测试每个方法。打破适当的秒表并测量两者。