我在 ConcurrentSkipListSet 上使用 DescendingIterator 方法。我刚刚检查了文档并注意到以下评论:
“升序视图及其迭代器比降序视图及其迭代器更快。”
See https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentSkipListSet.html#descendingIterator-- https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentSkipListSet.html#descendingIterator--
不幸的是,它没有提供这方面的更多信息。有什么样的性能差异?这很重要吗?为什么会有性能差异?
如果您查看维基百科页面跳过列表 https://en.wikipedia.org/wiki/Skip_list您将看到它们实际上是一种复杂形式的链接列表,其中链接按照列表条目的排序方向进行。 (该图清楚地说明了这一点......)
当您向前遍历跳过列表时,您只需跟随链接即可。每个next()
call 是一个 O(1) 操作。
当你反向遍历跳跃列表时,每个next()
呼叫必须找到钥匙before最后一个键返回。这是一个 O(logN) 操作。
(但是,向后遍历跳跃列表仍然比向后遍历单链表快得多。对于每个来说,这将是 O(N)next()
称呼 ...)
如果你仔细观察,你会发现ConcurrentSkipListSet
实际上是一个包装ConcurrentSkipListMap
。在那堂课上,Node
映射的跳跃列表表示中的对象形成单链接链......在升序键方向上。 (从前面)可以看出,升序迭代比降序迭代更快。
性能差异将非常显着,并且随着集合大小的增加,由于 O(1) 与 O(logN) 的差异,这种差异将变得更加显着。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)