java - StringBuilder 适合复合结构(如 Map<String、List<String>>)的大小

标签 java stringbuilder

给出以下代码作为示例:

Map<String, List<String>> warningMap = (Map<String, List<String>>) warningsOrErrorsMapVariable;
StringBuilder warningMessages = new StringBuilder(size?!);

for (Iterator<String> keyIterator = warningMap.keySet().iterator(); keyIterator.hasNext();) {
    Object key = keyIterator.next();
    if (!keyIterator.hasNext()) {
        isLastKey = true;
    }

    List<String> values = warningMap.get(key);

    if (values != null) {
        isLastValue = false;
        for (Iterator<String> valueIterator = values.iterator(); valueIterator.hasNext();) {
            String message = valueIterator.next();
            if (!valueIterator.hasNext()) {
                isLastValue = true;
            }               

            warningMessages.append(message);
            if (!(isLastKey && isLastValue)) {
                warningMessages.append(NEW_LINE);   
            }
        }
    }
}
return warningMessages.toString();

为复合结构声明具有适当大小的 StringBuiler 的最佳实践是什么?

其中一个选项是通过 mapElems* listElems * returnedListElemSize 来预测整个 map 的大小,另一个选项是访问每个元素并获取准确的大小,但这两个选项都需要迭代所有 map 两次 - 首先获取大小,其次获取附加到缓冲区的字符串值。这值得么?

整个“计算元素大小”会比在需要时调整构建器缓冲区大小更耗时吗?

最佳答案

对我来说听起来像是一个过早的优化。在大多数情况下,默认大小实际上并不是最佳选择(很少对短于 16 个字符的字符串使用 StringBuilder),因此做一个简单的假设。

除非您确实存在性能问题,否则计算或多或少准确缓冲区大小所增加的复杂性并不会带来返回。只需从稍大的缓冲区 256 或 1024 字节开始,然后就不用管它了。

在你的代码中,我宁愿关注低效循环而不是 Map :您正在迭代 keySet()并使用Map.get()在几乎每次迭代中获取值。使用 entrySet() 进行迭代从头开始!

另请参阅

关于java - StringBuilder 适合复合结构(如 Map<String、List<String>>)的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9141146/

相关文章:

java - 用字符串替换 StringBuffer/StringBuilder

Java : Clearing StringBuffer contents

java - 我们可以在 Java 中将 String 数组添加到 StringBuffer 或 StringBuilder 中吗?

java - 访问容器字段

java - 打印出 TreeMap<String, TreeSet<String>> 键和映射值

java - 为什么 String、StringBuffer 和 StringBuilder 类使用字节数组而不是字符数组来存储字符串的字符?

c# - 为什么StringBuilder类不是继承自Stream?

java - IcePDF 查看器自定义帮助

java - 复制数据库 JPA

java - 使用带有 'SELECT OBJECt(var) FROM EntityName var 的 @NamedQuery 实现查询