为什么EnumSet是作为抽象类实现的,而EnumMap是作为具体类实现的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么EnumSet是作为抽象类实现的,而EnumMap是作为具体类实现的?相关的知识,希望对你有一定的参考价值。

我想知道,有什么理由为什么EnumSet被实现为抽象类而EnumMap被实现为具体类?

答案

EnumSet实际上有两个实现 - 一个用于具有64个或更少元素的枚举(表示集合中存在值的标志存储为long),另一个用于其他枚举(标志存储为long[])。 EnumSet的工厂方法根据传入的枚举类返回其中一个。

这样的优化对于EnumMap没有意义(因为无论如何都需要存储值的数组),因此EnumMap是一个具体的类。

另一答案

EnumSet使用两个实现,RegularEnumSetJumboEnumSet,具体取决于枚举的大小(64个元素是阈值)。工厂方法委托给适当的实现。

另一方面,EnumMap对所有枚举类型都是一样的(它保存了所有枚举项的数组和一个大小相等的值),因此不需要抽象类。

以上是关于为什么EnumSet是作为抽象类实现的,而EnumMap是作为具体类实现的?的主要内容,如果未能解决你的问题,请参考以下文章

java集合Set集合之EnumSet详解

Java 中 Enum 如何继承?

java的枚举类enum,定义静态变量还可以有抽象方法,但枚举类不能被继承

转行小白成长路-java篇

java枚举方面的问题,见问题补充

Android中是否推荐使用枚举Enum