我有一个android应用程序,其核心组件是aHashMap<String,float[]>.
系统具有高并发性。例如
下面是我经常遇到的三种情况,它们在本质上是高度重叠的
遍历hashmap中的所有键并对
它的值(只读操作)。
在hashmap中添加新的键和值对。
从hashmap中移除某些键。
我在不同的线程中执行所有这些操作,因此使用ConcurrentHashMap,因为检索中的某些不一致并不重要。例如,在迭代映射时,如果添加了新条目,那么不立即读入这些新值并不重要,因为我确保下次读取它们时。
此外,在删除条目的同时,我每次都会重新创建迭代器,以避免“concurrentmodificationexception”
假设,下面有一个hashmap(即concurrenthashmap)

ConcurrentHashMap<String,float[]> test=new ConcurrentHashMap<String, float[]>(200);

现在为了检索,我做了以下工作
Iterator<String> reader=test.keySet().iterator();
            while(reader.hasNext())
            {
                String s=reader.next();
                float[] temp=test.get(s);
                //do some operation with float[] temp here(read only operation)
            }

对于移除,我执行以下操作
boolean temp = true;
        while (temp) {
            for (String key : test.keySet()) {
                temp = false;
                if (key.contains("abc")) {
                    test.remove(key);
                    temp = true;
                    break;
                }
            }
        }

当插入新值时
test.put("temp value", new float[10]);

我不确定这是否是一个非常有效的利用。另外,不读入移除的值也没关系(但是我需要效率,而且由于迭代器是在函数调用期间再次创建的,所以它保证下次我不会得到移除的值),这样就可以容忍很多不一致性?
有人能告诉我一个有效的方法吗?
另外,我忘了说我为什么要这样做手术。
现在,我已经更改了从等于包含中删除它的条件(可能有多个sting的前缀为“abc”,后面跟着不同的后缀)。所以我需要删除所有这些。

最佳答案

遍历hashmap中的所有键并对其值执行一些操作(只读操作)。
不要遍历键集,然后也检索值-直接遍历条目集:

for (Map.Entry<String, float[]> e : map.entrySet() {
    String key = e.getKey();
    float[] value = e.getValue();
    //do something with them
}

这通常更有效(即使对于“普通”hashmaps),但它也会减少在您的情况下的争用(对map的一半访问)。
在hashmap中添加新的键和值对。
是的,很简单:map.put(s, f);
从hashmap中移除某些键。
如果您需要检查键是否包含给定的子字符串,那么您确实需要像您所做的那样对键进行迭代,尽管我不确定为什么您要使用while+for+break而不是simple for。

10-08 11:10
查看更多