【发布时间】:2019-06-24 09:11:05
【问题描述】:
我有一个由固定数量的键组成的哈希图,这些键是预防性填充的。现在,在一个循环中,我必须检查每个键以替换值,以防它必须更改。
遗憾的是,由于需要迭代次数,它非常慢。我真的很想维护一个键值结构,因为它在我的模块顶部和末尾使用,但我想至少提高性能。
我还考虑使用 arrayList 来缩短插入时间,但在这种情况下,搜索会变慢并且我会失去键值功能。 如果我在开始时对 key 上的 arraylist 进行排序,然后使用二进制搜索查找值会怎样?
在地图上搜索和书写有更好的解决方案吗?
谢谢,
编辑:代码
for (Entry<String, VariableInfo> entry : VariablesMap.entrySet()){
String varName = entry.getKey();
VariableInfo info = entry.getValue();
Object value = info.convertToValue();
DialogWait dialogWindow = new DialogWait();
SwingWorker<Void, Void> swingWorker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
while(newTimeSet != _record.getCurrentTimeMs()) {
_record.stepForward();
if(valuesMap.get(varName)!=value)
valuesMap.put(varName, value);
}
dialogWindow.close();
return null;
}
};
swingWorker.execute();
dialogWindow.makeWait("Loading");
}
【问题讨论】:
-
您的
HashMap有多大?密钥的类型是什么? -
你能量化“相当慢”吗?那张地图有多大?决定是否需要更换密钥的逻辑是什么?你能显示一些代码吗?
-
为什么要检查每个键来替换值?
-
很可能您通过 keySet() 循环检查了您的密钥,因此,您将
O(1)->O(n)hashtable.get(key) 设为 O(1)。所以显示一些检查键和更新值的代码。 -
if(valuesMap.get(varName)!=value)看起来有风险。您可能想要! a.equals(b)而不是 `a != b`
标签: java performance hashmap