java - JAVA中ArrayList<String[]>高效转换为多行String

标签 java arrays string performance

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 而不仅仅是 StringFileWriter 就是一个很好的例子。在这些情况下,您甚至不需要将 StringBuilder 转换为 String,因为 StringBuilder 可以像其 一样轻松传递>String 结果,如果内容非常大,这可能是另一个性能优势。

关于java - JAVA中ArrayList<String[]>高效转换为多行String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25737365/

相关文章:

javascript - jQuery:从具有多个类实例的对象访问元素

python - 比较 NumPy 数组的两个(嵌套)列表/元组

java - java中递归生成字符串的所有排列

java - 检查 JTextField 是否仅包含特定允许的字符

java - 正确的图形引用方法?

java - 在java中使用keyAdapter和keyEvent时出错

java - 在 Hadoop 2.2.0 中使用 Mahout 1.0-SNAPSHOT 时,seqdirectory 在 MapReduce 模式下引发错误

java - 如何创建隐藏其参数的 Wicket URL?

javascript - 尝试在表格中显示数组(Javascript + html)

java - 使用 replaceAll 或 Pattern Matcher 替换字符串