1

假设我已将枚举和相应的 emummap 声明为:

enum MyEnum {
    CONSTANT1, CONSTANT2, CONSTANT3;
}

EnumMap<MyEnum, String> MyEnumMap = new EnumMap<MyEnum, String>(MyEnum.class);

我想迭代MyEnumMap,例如,只是为了Entry逐个打印。

在以下情况下,迭代键的最佳方法(最快)是什么:

  1. 当确保每个常量 inMyEnum是一个 key inMyEnumMap
  2. 当每个常量MyEnum可能是也可能不是MyEnumMap

我想使用MyEnumMap.keySet()或在 foreach 循环之间进行选择MyEnum.values()。任何其他方法都是最受欢迎的。

4

4 回答 4

2

不要紧。在内部,EnumMap是用一对长度与条目数相同的数组来实现的。enum一个数组有enum元素,而第二个数组有映射到它们的对象或NULL占位符。因此,任何迭代EnumMap都等效于for遍历整个enum序数范围的整数索引上的循环,因此您应该选择使您的代码最易读的方法。

于 2015-05-24T09:49:01.270 回答
1

如果你看一下代码EnumMap#keySet()

381  公共 设置<K> keySet() { 
382 设置<K> ks = keySet; 第
383384_ _ 385 else 386 return keySet = new KeySet (); 第387




您会注意到它返回keySet内部EnumMap用于存储密钥。

现在每次我们调用时,MyEnum.values()我们都会得到不同的数组,其中填充了所有枚举元素。这意味着创建了第一个空数组,稍后需要填充所有需要迭代的枚举。

因此,在第一种方法中,您将跳过对已由 map 存储的枚举的迭代,而在第二种方法中,我们只是创建一些临时数组,其中涉及对所有 MyEnum 元素的额外迭代。

于 2015-05-24T09:49:50.613 回答
1

也许,您只是想要另一种编写代码的方式......因为键总是唯一的

for(MyEnum myEnum: MyEnum.values()){
        String value = map.get(myEnum);
         If(value != null){ 
             //use the value here
          }
 }

只是另一种写法。

或者你也可以试试

for (Map.Entry<MyEnum, String> entry : map.entrySet()) {       
           System.out.println(entry.getKey() + "/" + entry.getValue()); 
 }
于 2015-05-24T09:59:29.747 回答
0

这取决于您的应用程序逻辑,但这里有一些提示:

1)

 // it is a bit faster to iterate over plain array, than over Set
 // And you can also get here information about entries that are in enum, but not in hashMap, so you can have logic for those cases.
 for (MyEnum e: MyEnum.values()) {
     // you can get here information what is contained and not contained in your map
}

对于 2) 但使用 1) 仍然更好,因为您可以获得 Map 中未包含的枚举值的信息。

for (MyEnum e: MyEnumMap.keySet()) {
   // you can check here all that is in your map, but you cant tell what is in enum but not in your map
}
于 2015-05-24T09:28:15.140 回答