Java EnumMap 参数混淆

标签 java enum-map

我是第一次使用 EnumMap,不明白传递的参数实际上在做什么。据我所知,它只是“K.class”,其中 K 是 map 键。这工作得很好,但我在 Java 的其他任何地方都没有看到它,我不清楚它在构造中实际扮演什么角色。

我猜这是一个理论问题,因为代码运行:“K.class”参数是什么意思,EnumMap 需要它做什么?

最佳答案

请参阅 class literals 的链接问题.

EnumMap特别需要它,因为它需要知道枚举有多少个不同的值。这是因为 EnumMap 是一种针对枚举的高度优化的映射实现,它只使用一个数组,每个可能的值都有一个槽(而不是像 HashMap 这样的更大的数组)。当您调用 get() ,它检索给定键的索引(即第一个枚举值、第二个枚举值等)并在其内部数组的适当位置查找。为此,构造函数需要知道可能值的数量以分配正确大小的数组。 给定类对象,它可以调用 getEnumConstants() 找出此枚举的现有值的数量。

此外,想象一下下面的代码:

enum Enum1 { V1, V2; }
enum Enum2 { W1, W2; }
EnumMap<Enum1, Object> map = new EnumMap<Enum1, Object>(Enum1.class);
map.put(Enum1.V1, new Object());
map.get(Enum2.W1);

现在 get方法显然应该返回 null .然而,正如我所说, map 内部只有一个数组,在本例中大小为 2,新对象在第一个槽中,null 在第二个槽中。当您将它传递给 put() 时,它没有存储对 Enum1.V1 的引用.然而,方法 get现在需要知道传递的值不属于正确的枚举,因此映射中此键没有值。这里它也需要正确枚举的类型,为此您需要将类型传递给构造函数。

如果您不向构造函数提供有关枚举的一些信息,它就不会知道您打算将哪个枚举用于此 map 实例。即使你写新的EnumMap<MyEnum, SomeValue>() ,构造函数无法知道值 MyEnum由于类型删除而导致的泛型类型参数。因此需要另一种方式将信息传递给构造函数。

关于Java EnumMap 参数混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22104643/

相关文章:

java - 显示错误的时差

java - 尽管 EnumMap 未同步,但它如何安全地失败

java - 枚举列表 : I have 2 enums and I have to make a list/array

java - 如何使用 Guava 初始化空的 ImmutableEnumMap?

Java 编译器错误 : lookup table exceeds 65535 limit

java - 在不关闭 System.in 的情况下关闭扫描仪

java - java8中的流切割

kotlin - 从 Kotlin 中的值列表创建 EnumMap

java - EnumMap 在 Java 中与枚举类型值一起使用是否等效?

java - Java 如何处理泛型的模糊类型推断?