加快哈希图写入

时间:2019-06-24 09:11:05

标签: java performance hashmap

我有一个Hashmap,它由固定数量的键组成,这些键是预防性填充的。现在,在循环中,我必须检查每个键以替换必须更改的值。

可悲的是,由于需要迭代次数,它非常慢。我真的很想维护一个键值结构,因为它在模块的顶部和结尾使用,但是我至少希望提高性能。

我还考虑过使用arrayList来缩短插入时间,但是那样的话搜索会变慢,并且我会失去键值功能。 如果我先对键上的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");                   
}

1 个答案:

答案 0 :(得分:1)

  

现在,在循环中,我必须检查每个键以替换必须更改的值。

如果必须更改值的条件变为true,是否可以更新列表?因此,基本上,您能否在地图外部重写代码以对更改做出反应,而不是根据状态定期更改地图?通常,这是对性能的相当有力的改进,它将使您的地图更加有用,因为它是最新的。

如果您确实必须定期检查Map中的每个条目,那么使用O(n)并对其进行迭代,就可以得到map.entrySet()的运行时。假设您无法预测有关输入映射的信息,则无法对其进行优化。

如果您有某些条目,这些条目以较高的频率或概率发生变化,则可以通过在此处应用比其他条目更高的检查频率来进行优化。为此,您可以使用LinkedHashMap。使用它,您可以插入元素,并且列表会跟踪插入的顺序。有了它,您可以轻松记住最后n个更改的元素,并将其优先于其他元素。