gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:33:05 33 4
gpt4 key购买 nike

给出以下代码作为示例:

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/

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