gpt4 book ai didi

java - 高效地使用 ConcurrentHashMap?

转载 作者:太空狗 更新时间:2023-10-29 16:19:29 27 4
gpt4 key购买 nike

我有一个 Android 应用程序,其核心组件是 HashMap<String,float[]>.系统具有高并发性。例如这是我经常遇到的以下三种情况,它们在本质上是高度重叠的

  1. 遍历 hashmap 中的所有键并对其进行一些操作它的值(只读操作)。
  2. 在 Hashmap 中添加新的键值对。
  3. 从 HashMap 中删除某些键。

我在不同的线程中执行所有这些操作,因此我使用了 ConcurrentHashMap 因为检索中的一些不一致并不重要。例如 在迭代 map 时,如果添加了新条目,那么不立即读入这些新值并不重要,因为我确保下次读取它们。

此外,在删除条目时,我每次都重新创建迭代器以避免“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]);

我不确定它是否是一个非常有效的利用。同样重要的是不要读入删除的值(但是我需要效率,并且由于迭代器是在函数调用期间再次创建的,它保证下次我不会得到删除的值)所以很多不一致可能是可以忍受吗?

有人能告诉我一个有效的方法吗?

附言。我忘了说为什么我要以这种方式进行删除操作。我现在已经将其删除的条件更改为包含(可能有多个带有前缀“abc”后跟不同后缀的字符串。所以我需要删除所有这些字符串。

最佳答案

Iterate through all the keys in the hashmap and do some operation on its value(read only operations).

不要遍历键集然后也检索值 - 直接遍历条目集:

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

这通常更有效(即使对于“普通”HashMap),但它也会减少您的情况下的争用(对 map 的访问次数减半)。

Add new key,value pairs in the Hashmap.

是的,它很简单:map.put(s, f);

Remove Certain keys from the Hashmap.

如果您需要检查键是否包含给定的子字符串,那么您确实需要像现在一样遍历键,尽管我不确定为什么您使用 while+for+break 而不是简单的 for。

关于java - 高效地使用 ConcurrentHashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18555506/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com