如何自动增加HashMap中的键?

时间:2017-12-01 14:13:14

标签: java hashmap concurrenthashmap

我有一个多线程应用程序。多个线程将事物放入Map中,其中每个事物必须具有唯一ID。现在我为此目的使用TreeMap,如下所示:

TreeMap<Integer, Thing> things = new TreeMap<>();
things.put(things.isEmpty() ? 0 : things.lastKey() + 1, thing);

但是TreeMap不是线程安全的,所以我决定用ConcurrentHashMap替换它。

但是如何使用HashMap实现相同的目标呢?那么如何为我投入的每件事生成一个新的唯一键呢?

3 个答案:

答案 0 :(得分:2)

您可以使用Javas AtomicInteger类生成唯一的整数。它有一个线程安全的getAndIncrement()方法用于此目的。

但是,即使使用不同的密钥,这也可能会导致HashMap中出现一些不可预测的错误。此处列出了一些示例:Is a HashMap thread-safe for different keys?

因此,请务必使用线程安全映射或其他更快速的线程安全数据结构(如Vector)。如果您知道将添加多少元素的上限,则使用具有AtomicInteger索引的数组将是最快的,因为您可以避免所有同步。

答案 1 :(得分:1)

你可以这样写(某事):

Map<Integer, Integer> map = new ConcurrentHashMap<>();
AtomicInteger ai = new AtomicInteger(-1);

map.compute(x, (l, r) -> {
    return ai.incrementAndGet();
})

compute被记录为原子

答案 2 :(得分:0)

考虑使用UUID作为密钥,extremely unlikely将发生冲突。像这样:

// import java.util.UUID;
UUID uuid = UUID.randomUUID();
String randomUUIDString = uuid.toString();