Ale*_*rin 2 java stringbuilder java-8
假设我有一个ArrayList<String>500的大小,然后我想有效地连接索引(从1开始)的字符串:1-100,101-200,...,401-500字符串(所以我想得到5个字符串而不是500).我以为我可以使用StringBuilder,然后使用.toString,但.toString()方法StringBuilder创建一个新字符串,所以有效地我将创建5 * 2 = 10的字符串这是坏的(这些字符串是真正巨大的,我很短的空间).什么是最好的内存和时间有效的方法呢?
到目前为止我尝试过的:
有一个错字:我的意思是StringBuilder代替StringBuffer.我使用了StringBuilder一个简单的for循环ArrayList<String>.所以我使用了3x空间(1x - 初始ArrayList,2x - for StringBuilder,3x - 当sb.toString()有效创建返回时调用new String(value, 0, count);)
一种选择是使用List#subList(因为它只是一个视图,List不应该使用更多的内存).然后你可以打电话String#join给它:
String.join(" " /*Delimiter*/, list.subList(0, 100 /*Exclusive*/));
Run Code Online (Sandbox Code Playgroud)
把它放在for循环中并将每个存储String到a的索引中String[],你就可以了!
根据大众的需求,这里有一个可能更有效的替代解决方案,但必须使用JMH进行适当的基准测试:
String[] strings = new String[5];
for (int i = 0; i < 5; i++) {
List<String> subList = list.subList(100 * i, 100 * (i + 1));
StringBuilder sb = new StringBuilder(subList.stream().mapToInt(String::length).sum());
for (int j = 0; j < 100; j++) {
sb.append(subList.get(i));
}
strings[i] = sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
如果您提前知道每个子列表的长度总和,或者将调用替换List#stream为其自己的for循环,则可以进行改进.
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |