【问题标题】:Making one string of List<List<String>> takes very long time [duplicate]制作一串 List<List<String>> 需要很长时间[重复]
【发布时间】:2017-03-14 21:59:49
【问题描述】:

我有一个 List 包含 370 个元素,每个元素都是 List &lt;String&gt; 包含 4 个字符串。我正在通过这样做来制作所有数据的一大串:

String veryBigString = "";
for (List <String> s : myList) {
    for (String e : s){
            veryBigString += e;
    }
}

但是,这需要很长时间。有什么办法可以让这个过程更快吗?

编辑:像你们许多人建议的那样使用 StringBuilder,我得到java.lang.OutOfMemoryError。也许我做错了什么:

StringBuilder sb = new StringBuilder();
for (List <String> s : birdsInfoList) {
     for (String e : s){
         sb.append(e);
     }
}
Log.i("Very big String", String.valueOf(sb));

【问题讨论】:

  • 理想情况下,完全避免这样做。否则,请使用StringBuilder
  • 每次你做veryBigString += e 你都是在创建一个新的字符串对象,因为字符串是不可变的。 StringBuilder 在这里是理想的,因为您不需要每次添加新对象,您只需调用 stringBuilder.append( e )
  • 提示:尝试在你的外部列表上调用 toString ......这正是你的代码在做什么!
  • @CommonsWare 做到了。您应该使用 StringBuilder。这个解决方案很好地解释了原因:stackoverflow.com/questions/5234147/…
  • @CommonsWare 不是真的,javac 会编译成 StringBuilder

标签: java android arraylist


【解决方案1】:

您应该使用 StringBuilder,然后使用 concatenate。性能要好得多。

StringBuilder sb = new StringBuilder("Hello")
    .append("World");

有关这方面的更多信息,您可以阅读this

来自 Oracle 文档:

StringBuilder 对象类似于 String 对象,不同之处在于它们可以是 修改的。在内部,这些对象被视为可变长度 包含一系列字符的数组。在任何时候,长度 序列的内容可以通过方法调用来改变。

除非字符串生成器提供 在更简单的代码方面的优势(见最后的示例程序 本节)或更好的性能。例如,如果您需要 连接大量字符串,附加到 StringBuilder 对象更有效。

在这里阅读:http://docs.oracle.com/javase/tutorial/java/data/buffers.html

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多