【发布时间】:2013-09-01 05:19:46
【问题描述】:
我有一个 Android 应用程序,其核心组件是 HashMap<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]);
我不确定它是否是一种非常有效的利用方式。另外,不要读入已删除的值也很重要(但是我需要效率,并且由于在函数调用期间再次创建了迭代器,因此可以保证下次我不会得到已删除的值),因此可能会出现很多不一致能忍受吗?
有人可以告诉我一个有效的方法吗?
附言。我忘了提到为什么我要以这种方式进行删除操作。 我现在已经改变了删除它的条件,从等于包含(可能有多个stings具有前缀“abc”后跟不同的后缀。所以我需要删除所有这些。
【问题讨论】:
-
迭代整个地图以删除一个条目当然效率不高。为什么不直接调用 remove("abc")?
-
是的,哎呀,我现在已将删除条件更改为包含..
-
不,您应该将整个块更改为仅对 remove() 的一次调用。你不需要其他任何东西,我不明白你为什么不这么认为。 –1
标签: java android concurrency concurrenthashmap