java - 有没有什么有效的方法可以从动态更新的java ConcurrentHashMap中获取随机值?

标签 java

如果我有一个始终在更新的 ConcurrentHashMap(添加更多或获取条目..有时可能为空)...

是否有任何有效的方法可以在恒定时间内随机从中获取值?

最佳答案

似乎没有办法获得键或条目的随机访问 View ,而无需在其内部的某个地方制作 O(n) 副本。不过,复制速度可能会非常快;在知道这是一个问题之前不要进行优化。

我能想到的唯一选择是与 map 并行保留条目列表。每当您添加到 map 时,也会添加到列表中。任何时候你从一个地方移除,也要从另一个地方移除。您可以将其包装在您自己的 Map 实现中:

   public class RandomAccessConcurrentHashMap<K,V> implements Map<K,V> {

        private List<K> backingList = new ArrayList();
        private Map<K,V> backingMap = new ConcurrentHashMap<>();

        public V put(K key, V value) {
            backingList.add(value);
            return backingMap.put(key,value);
        }

        ...
   }

(原则上 - 您需要考虑线程安全,并且可能会找到比 ArrayList 更有效的存储)

关于java - 有没有什么有效的方法可以从动态更新的java ConcurrentHashMap中获取随机值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44151235/

相关文章:

Java WSDL Web 服务获取客户端证书

java - 如何在底部导航菜单单击上恢复片段?

java - 将表从 Postgres 数据库(在服务器上)导出到 java 中的 csv 文件(在本地)

java - 为什么我无法从 hbase.io.hfile 包中导入类

java - 添加 admob 会导致不存在的错误。错误 - java.lang.IllegalArgumentException : Service not registered: lt@777a78f

exception - Java 编译器是设计成这样工作还是有限制?

java - 在 Java 和 (Rhino) Javascript 之间传递通用类型

java正则表达式去除xpath字符串中的根元素

java - 将 Java ThreadFactory 创建的对象的所有引用置为 null 的方法

Java OutOfMemoryError 没有抛出