【问题标题】:Extracting a list out of NavigableMap从 NavigableMap 中提取列表
【发布时间】:2019-01-24 06:05:37
【问题描述】:

这是来自my previous question 的后续问题。

我正在尝试实现定义为NavigableMap<Timestamp, Event>NavigableMap。我需要这张地图对我来说就像一个缓存。我每 5 分钟刷新一次 NavigableMap

一个线程更新这个NavigableMap,另一个从它读取,所以它需要是线程安全的。每当我有请求时,我都需要获取Events 的子集列表,其时间戳在给定的startend 时间内。

NavigableMap 转换为此子集列表(例如ArrayList)的最有效方法是什么?这个接口的线程安全实现是什么?

显然NavigableMap 有一个子地图方法以及floorceiling,但我没有看到任何东西可以转换为一个有开始和结束时间的列表。

【问题讨论】:

  • 这是本地 ArrayList 吗?
  • 本地是什么意思?!
  • 我认为是的。请求线程需要生成一个本地数组列表并在本地使用它。

标签: java concurrency hashmap treemap concurrenthashmap


【解决方案1】:

要从NavigableMap 中提取键范围,请调用subMap(K fromKey, K toKey)subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)

如果您只想将值作为列表,请执行以下操作:

List<Event> list = new ArrayList<>(map.subMap(start, end).values());

这个接口的线程安全实现是什么?

根据javadocConcurrentSkipListMap

【讨论】:

  • subMap 只是底层地图的一个视图,所以它的时间复杂度只是O(1)。不过,获取它的第一个元素是O(logN)。然后,它只是一个遍历。因此,将子图复制到ArrayList 将是O(logN + M)N 是地图中的条目总数,M 是给定范围内的元素数。小心ConcurrentSkipListMap,因为批量操作需要外部同步,特别是因为它的size() 方法具有O(N) 时间复杂度。 @TinaJ
  • 谢谢。如果我使用ConcurrentSkipListMapsynchronized{treeMap} 有什么区别吗?!
  • 是的。 synchronized{treeMap} 不同步迭代,所以你必须自己做,即在new ArrayList&lt;&gt;(submap) 调用期间,synchronized 可能比ConcurrentSkipListMap
猜你喜欢
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多