java - 使用 StringBuilder 在代码上运行 pmd 会给出有关初始化大小和附加大小的错误

标签 java string stringbuilder pmd stringbuffer

private static String buildSomeString(Map<String, String> data) {
    StringBuilder result = new StringBuilder();
    for (Map.Entry<String, String> field : data.entrySet()) {
       result.append("some literal")
            .append(field.getKey())
            .append("another literal")
            .append(field.getKey())
            .append("and another one")
            .append(field.getValue())
            .append("and the last in this iteration");
     }
     return result.toString();
}

当我对此运行 pmd 时,出现以下错误

StringBuffer constructor is initialized with size 16, but has at least 83 characters appended.

字符数可能是错误的,因为我在发布之前更改了文字。

谢谢

最佳答案

StringBuilder 的构造函数可以选择接收具有要使用的内部缓冲区大小的 int。如果没有给出(如您的代码中所示),则默认为 16。

当您在StringBuilder上追加数据时,它将根据需要自动调整内部缓冲区的大小。这种调整大小意味着创建一个新的、更大的数组,并将旧数据复制到其中。这是“代价高昂”的操作(注意引号,这是一个微观优化,如果您使用不好的算法(例如冒泡排序),则会遇到更大的问题)。

对字符串的预期大小进行更有根据的猜测可以避免/最小化此类重新分配。

PMD 不知道 map 的内容是什么,但它知道它将包含至少 83 个字符(假定 map 不为空)。

这可以通过对大小进行更有根据的猜测来解决,例如:

StringBuilder result = new StringBuilder(83 * data.size()); // 83 or whatever you constant strings account for

如果您可以更好地接近 map 键和值的预期值,则可以进一步细化。通常,稍微超出实际预期输出会更好,因为即使这意味着分配更多内存,也更有可能完全避免重新分配。

关于java - 使用 StringBuilder 在代码上运行 pmd 会给出有关初始化大小和附加大小的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47334715/

相关文章:

java - 先用main方法加载类,再手动加载其他类

java - 如何取回存储在 JCEKS keystore 中的密码?

c# - 清除 StringBuilder 对象的当前字符串

java - 编写代码来清除字符串中不需要的字符

java - 在非满数组中随机选择一个数组元素

Java String.split ("\\s+")

sql-server - 获取sql server中重复多次的2个字符之间的字符串

string - 从 perl 变量中删除一个空格

Java ByteBuffer 清除数据

java - 如何在 JHipster 中向 JHI_USER 添加新字段