如何自动增加 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
被记录为原子的
我有一个多线程应用程序。多个线程将事物放入 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
被记录为原子的