gpt4 book ai didi

java - 以 block 的形式读取 ConcurrentHashMap (或类似的)

转载 作者:行者123 更新时间:2023-12-02 04:39:05 25 4
gpt4 key购买 nike

我有一个程序,它有一个 ConcurrentHashMap,其中不同的线程可以在 map 中添加/删除项目。

我很想知道以 25 个项目为一组来阅读 map 的最佳方法是什么。我想做的是这样的:用户单击按钮并从 map 中读取 25 个项目(与顺序无关)。之后,他可以单击“下一步”按钮并阅读另外 25 项(与前 25 项不同),依此类推。

我不确定是否可以使用 ConcurrentHashMap 来做到这一点。我不想使用数据库,我想将其保留在内存中。我认为将 Map 转换为 ArrayList 不会有帮助,因为大多数时候都会在 map 中添加/删除项目。

我对任何解决方案持开放态度,甚至是第三方库。

更新:我也不受 ConcurrentHashMap 的束缚。我只是在寻找最好的解决方案

更新2:它们的键是String

谢谢

最佳答案

在您的情况下,由于 String 键是严格排序的, ConcurrentSkipListMap是一条路要走。

  • 两者都是concurrentnavigable ,并且经常可以用来代替ConcurrentHashMap。
  • get/put/remove 的速度与 O(log N) 一样快。
  • 作为奖励,您将免费获得自然遍历顺序。

要从 ConcurrentSkipListMap 获取下一页,请使用上一页的最后一个键作为 anchor 调用 tailMap,然后从结果子映射构造迭代器或流:

    return map.tailMap(lastKey, false).entrySet()
.stream()
.limit(pageSize)
.collect(Collectors.toList());

请注意,即使从 map 中删除 anchor ,tailMap 也会成功。迭代将从下一个大于 anchor 的键开始。

<小时/>

如果键没有严格排序,或者需要 O(1) 复杂度,那么您可能更喜欢另一种建议 - 按照单元索引的顺序遍历的开放寻址哈希表。然而,标准 Java 类中没有这样的实现。此类映射的线程安全通常是通过锁定来实现的。

关于java - 以 block 的形式读取 ConcurrentHashMap (或类似的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34688454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com