我有一个逗号分层字符串,调用String.split(",")
它时返回一个大小约为 60 的数组。在特定用例中,我只需要获取将从数组返回的第二个值的值。因此,例如,"Q,BAC,233,sdf,sdf,"
我想要的只是第一个之后','
和第二个之前的字符串的值','
。我对性能的问题是我最好自己使用 substring 或使用 split 方法解析它,然后获取数组中的第二个值?任何输入将不胜感激。此方法每秒会被调用数百次,因此我了解有关性能和内存分配的最佳方法很重要。
-邓肯
我有一个逗号分层字符串,调用String.split(",")
它时返回一个大小约为 60 的数组。在特定用例中,我只需要获取将从数组返回的第二个值的值。因此,例如,"Q,BAC,233,sdf,sdf,"
我想要的只是第一个之后','
和第二个之前的字符串的值','
。我对性能的问题是我最好自己使用 substring 或使用 split 方法解析它,然后获取数组中的第二个值?任何输入将不胜感激。此方法每秒会被调用数百次,因此我了解有关性能和内存分配的最佳方法很重要。
-邓肯
由于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
。字符串中只有八个组件!六十个组件的差异会更大。
当然为什么要遍历整个字符串,只需使用substring()
和indexOf()
您当然最好手工完成,原因有两个:
.split()
将字符串作为参数,但该字符串被解释为 a Pattern
,并且对于您的用例Pattern
而言成本很高;我会使用类似的东西:
final int first = searchString.indexOf(",");
final int second = searchString.indexOf(",", first+1);
String result= searchString.substring(first+1, second);
我的第一个倾向是找到第一个和第二个逗号的索引并获取子字符串。
但是,唯一能确定的真正方法是在您的特定场景中测试每一个。打破适当的秒表并测量两者。