如何自动增加 HashMap 中的键?

How to auto increment the keys in a HashMap?

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

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

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

但是我怎样才能使用 HashMap 实现相同的目的呢?那么如何为我放入的每个东西生成一个新的唯一密钥?

考虑使用会发生碰撞的UUID for the keys, it's extremely unlikely。像这样:

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

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

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

所以一定要使用线程安全的映射,或者其他一些更快的线程安全数据结构,比如 Vector。如果您知道将添加多少元素的上限,使用具有 AtomicInteger 索引的数组将是最快的,因为您可以避免所有同步。

你可以这样写(东西):

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

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

compute 被记录为原子的