答案 0 :(得分:26)
EnumSet
实际上有两个实现 - 一个用于具有64个或更少元素的枚举(指示集合中存在值的标志存储为long
),另一个用于其他枚举(标志存储为long[]
)。 EnumSet
的工厂方法根据传入的枚举类返回其中一个。
这样的优化对EnumMap
没有意义(因为无论如何都需要存储值的数组),因此EnumMap
是一个具体的类。
答案 1 :(得分:7)
EnumSet
使用两个实现,RegularEnumSet
和JumboEnumSet
,具体取决于枚举的大小(64个元素是阈值)。工厂方法委托给适当的实现。
EnumMap
对所有枚举类型都是一样的(它保存了所有枚举项的数组和一个大小相等的值),因此不需要抽象类。