String.substring vs String [] .split

Dun*_*ebs 13 java memory garbage-collection

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

-Duncan

das*_*ght 29

由于String.Split返回a 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);
Run Code Online (Sandbox Code Playgroud)

以上打印 brown

多次运行时,substring按时获胜:1,000,000次迭代split需要3.36秒,而1,000,000次迭代substring只需要0.05秒.这就是字符串中只有八个组件!60个组件的差异将更加激烈.