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 writerClasses项大约需要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
接口的StringBuilder中构建内容。许多类接受CharSequence
s而不仅仅是String
s。一个很好的例子是FileWriter
。在这些情况下,您甚至不需要将转换为StringBuilder
,String
因为StringBuilder
可以像传递String
结果一样容易地传递它,如果内容确实很大,则可能是另一个性能优势。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句