Enum是可比较的,这意味着你可以拥有
NavigableSet<AccessMode> modes = new TreeSet<>();
NavigableMap<AccessMode, Object> modeMap = new TreeMap<>();
这些访问时间为O(ln N)。
Enum集合具有O(1)访问时间,但不是Navigable
NavigableSet<AccessMode> modes = EnumSet.noneOf(AccessMode.class); // doesn't compile
NavigableMap<AccessMode, Object> modeMap = new EnumMap<>(AccessMode.class); // doesn't compile
我想知道Enum集合是否不可导航(和排序)是有原因的。我错过了什么吗?
答案 0 :(得分:38)
JDK及其各种API缺少许多“明显”的功能。为什么忽略/遗忘这个特殊功能?我们只能猜测。但是您的问题长期以来一直是Sun / Oracle的RFE:
您可以通过评论来支持这些RFE。请注意,这是Joshua Bloch关于这个主题的权威答案:
我模糊地回忆起考虑它,但我不记得是否我们 明确拒绝了它有充分理由。我们跑得很低 我实现EnumSet和EnumMap的时候,有可能 时间在我们的决定中发挥了作用
http://comments.gmane.org/gmane.comp.java.jsr.166-concurrency/2158
所以即使他也不得不猜测: - )
答案 1 :(得分:9)
我最好的猜测是,导航性不被视为枚举集的主要用例。实现中没有任何内容会阻止可导航性。 TreeSet
和TreeMap
涵盖了将一组枚举成员需求与导航性相结合的罕见用例。
答案 2 :(得分:2)
这篇文章没有直接回答这个问题,也没有直接回答这个问题,它只是传达了为什么会引入Navigable
按照我的要求发帖(评论太长了)
简短的回答是Navigable存在是因为我们没有 任何像即将到来的“防守者” - 排序并没有描述所有的 常见功能,除了以外没有办法这样做 介绍一个新的界面。在实践中,我确信“Sorted”仍然存在 比“Navigable”更常用作声明类型,因为 大多数人不需要Navigable中定义的方法,但不需要 排序。加上“Navigable”并不是一个非常好的名字: - )
-Doug