给出以下代码作为示例:
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/