ArrayList<String[]> writtenClasses = new ArrayList<String[]>();
// usually there is functional code here that populates
// ArrayList<String[]> writtenClasses with variably 3000
// String[] objects always of exactly 8 lines each
ArrayList<String> processedClasses = new ArrayList<String>();
for(String[] classLines: writtenClasses)
{
for(String classLine: classLines)
{
processedClasses.add(classLine);
}
}
String result = "";
for(String fileLine: processedClasses)
{
result += fileLine + "\n";
}
我的代码在上面。它工作正常并产生我想要的结果,只是很慢。 ArrayList writtenClasses 的每个项目大约需要 10 毫秒,这在我给它更大的工作之前是可以的。我怀疑 ArrayLists 花费了这么长时间,但计时和打印到控制台作业统计信息在每次运行后显示的内容很少。
以上代码是对早期代码的改编,希望能提高效率。它这样做了大约 4%。下面的代码是我使用的旧方法,比上面的代码花费的时间稍长。
for(String[] classLines: writtenClasses)
{
for(String classLine: classLines)
{
result += classLine + "\n";
}
writtenClasses.set(writtenClasses.indexOf(classLines), null);
}
我做 writtenClasses.set(writtenClasses.indexOf(classLines), null);
只是为了提高内存效率,我的统计数据显示它使用内存的效率更高,CPU 量无法检测到努力。
这是我在 StackOverflow 上的第二个问题,我已尽力遵守规则,但如果我问这个问题很糟糕或在某种程度上不经意地不考虑周到,请向我强调这一点,我会解决那。 :)
最佳答案
创建中间 processedClasses
列表绝对没有用。此外,StringBuilder
将显着加快该过程:
// Consider a large initial size to even avoid reallocation, here I used 64 KB
StringBuilder sb = new StringBuilder(65536);
for (String[] classLines : writtenClasses)
for (String lines : classLines)
sb.append(lines).append('\n');
// Note: you might not even need to convert it to String, read reasoning below
String result = sb.toString();
我们在实现 CharSequence
接口(interface)的 StringBuilder 中构建内容。许多类接受 CharSequence
而不仅仅是 String
。 FileWriter
就是一个很好的例子。在这些情况下,您甚至不需要将 StringBuilder
转换为 String
,因为 StringBuilder
可以像其 一样轻松传递>String
结果,如果内容非常大,这可能是另一个性能优势。
关于java - JAVA中ArrayList<String[]>高效转换为多行String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25737365/