gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 20:06:47 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com