У меня есть приложение для Android, основным компонентом которого является HashMap<String,float[]>.
Система имеет высокий уровень параллелизма. например вот следующие три ситуации, у меня есть, которые происходят часто и они сильно перекрываются в природеЭффективно использовать ConcurrentHashMap?
- перебрать все ключи в HashMap и сделать некоторые операции на его значение (только для чтения операции).
- Добавить новый ключ, пары значений в Hashmap.
- Удалить некоторые ключи из Hashmap.
Я делаю все эти операции в разных потоках и, таким образом, я с помощью ConcurrentHashMap , поскольку некоторые несоответствия в извлечениях не имеет значения. например, При повторном использовании карты, если новые записи добавлены, не имеет значения, чтобы сразу не читать эти новые значения, поскольку я гарантирую, что в следующий раз они будут прочитаны.
Кроме того, при удалении записи я воссоздании итератора каждый раз, чтобы избежать «ConcurrentModificationException»
Предположим, существует следующая HashMap (т.е. ConcurrentHashMap)
ConcurrentHashMap<String,float[]> test=new ConcurrentHashMap<String, float[]>(200);
Теперь Retrieval я следующее
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]);
Я не уверен, что его очень эффективное использование. Также важно не читать удаленные значения (однако мне нужна эффективность, и поскольку итератор снова создается во время вызова функции, он гарантирует, что в следующий раз я не получу удаленные значения), так что может возникнуть большая несогласованность терпимо?
Может ли кто-нибудь сказать мне эффективный способ сделать это?
PS. Я забыл упомянуть, почему я делаю операцию по удалению таким образом. я сейчас изменяет свое состояние, на котором он был удалено из равных содержит (может быть несколько укусов, имеющих префикс «ABC», а затем различными суффиксами. Так что мне нужно, чтобы удалить все те, а затем.
Это, безусловно, неэффективно, чтобы перебрать всю карту, чтобы удалить одну запись. Почему бы вам просто не позвонить remove ("abc")? – EJP
Да, к сожалению, я изменил условие удаления на содержащийся. –
Нет, вы должны изменить весь блок на один вызов remove(). Тебе ничего не нужно, и я не понимаю, почему ты думаешь иначе. -1 – EJP