我第一次使用 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
。但是,正如我所说,映射内部只有一个数组,在这种情况下大小为 2,新对象在第一个槽中,而在第二个槽中为 null。当您将它传递给 put()
时,它没有存储对 Enum1.V1 的引用。但是,方法 get
现在需要知道传递的值不属于正确的枚举,因此映射中没有此键的值。这里也需要正确枚举的类型,为此您需要将类型传递给构造函数。如果您不向构造函数提供有关枚举的一些信息,它就不会知道您打算与此映射实例一起使用哪个枚举。即使您编写新的
EnumMap<MyEnum, SomeValue>()
,由于类型擦除,构造函数也无法知道泛型类型参数的值 MyEnum
。因此需要有另一种方式将信息传递给构造函数。关于Java EnumMap 参数混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22104643/