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/