我有一个程序,有一个ConcurrentHashMap
不同的线程可以添加/删除地图中的项目.
我很想知道在25个项目中读取地图的最佳方法是什么.我想要做的是这样的:用户点击按钮并从地图中读取25个项目(与订单无关).之后,他可以单击"下一步"按钮并读取另外25个项目(与前25个项目不同),依此类推.
我不确定我是否可以这样做ConcurrentHashMap
.我不想使用数据库,我想把它保存在内存中.我不认为转换Map
成一个ArrayList
会有帮助,因为大多数时候都会在地图中添加/删除项目.
我愿意接受任何解决方案,甚至是第三方库.
更新:我也没有被束缚ConcurrentHashMap
.我只是在寻找最好的解决方案
更新2:他们的钥匙是String
谢谢
在您的情况下,由于String键是严格排序的,因此ConcurrentSkipListMap
是一种方法.
它既可以并发也可以导航,并且可以经常用来代替ConcurrentHashMap.
get
// put
和remove
一样快O(log N)
.
作为奖励,您将获得免费的自然遍历订单.
要从ConcurrentSkipListMap获取下一页,请tailMap
使用上一页的最后一个键作为锚点进行调用,然后从结果子图中构造迭代器或流:
return map.tailMap(lastKey, false).entrySet() .stream() .limit(pageSize) .collect(Collectors.toList());
请注意,tailMap
即使从地图中删除了锚键,也会成功.迭代将从大于锚点的下一个键开始.
如果密钥没有严格排序,或者需要O(1)复杂度,那么您可能更喜欢另一种建议 - 以单元索引的顺序遍历的开放寻址哈希表.但是,标准Java类中没有这样的实现.这种映射的线程安全性通常通过锁定来实现.