java - String.substring 与 String[].split

标签 java memory garbage-collection

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

-邓肯

最佳答案

由于 String.Split 返回一个 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);

以上prints 棕色

当您多次运行此操作时,substring 会按时获胜:split 的 1,000,000 次迭代需要 3.36 秒,而 substring只需要0.05s。字符串中只有八个组件!六十个组件的差异会更大。

关于java - String.substring 与 String[].split,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13997361/

相关文章:

language-agnostic - 复制垃圾收集器如何确保复制时不会访问对象?

C#:如何避免这种潜在的内存泄漏

java - 获取X509证书的指纹

JavaFX:阶段和 Controller 生命周期...内存管理

c# - 列表在不应该使用重复数据时填充

java - -XX :+UseConcMarkSweepGC (what is default young generation collector? )

java - 如何在Java中对原语进行等效的通过引用传递

java - 将字符串编码为 UTF-8

java - 在并行测试执行中使用 Hashmap 作为线程安全

java - Android 暂停和恢复教程