java - 如果查找键是字符串,则 EnumMap 或 HashMap

标签 java collections hashmap enum-map

我试图权衡使用 EnumMap 而不是 HashMap 的利弊。因为,我将一直使用 String 进行查找,看来带有 String 键的 HashMap 将是正确的选择。但是,EnumMap 似乎是更好的设计,因为它传达了我将键限制为特定枚举的意图。想法?

这是一个虚构的例子,展示了我将如何使用 Map:

enum AnimalType { CAT, DOG }
interface Animal {}
class Cat implements Animal {}
class Dog implements Animal {}

public class AnimalFactory {

    private static final Map<AnimalType, Animal> enumMap 
            = new EnumMap<AnimalType, Animal>(AnimalType.class);
    // versus
    private static final Map<String, Animal> stringMap 
            = new HashMap<String, Animal>();

    static {
        enumMap.put(AnimalType.CAT, new Cat());
        enumMap.put(AnimalType.DOG, new Dog());
        stringMap.put("CAT", new Cat());
        stringMap.put("DOG", new Dog());
    }
    public static Animal create(String type) {
        Animal result = enumMap.get(AnimalType.valueOf(type));
        Animal result2 = stringMap.get(type);
        return result;
    }
}

假设 AnimalType 枚举和 map 将仅由 AnimalFactory 用于创建动物,而不能用于其他任何地方。

我应该使用哪个 map

最佳答案

如果可以枚举所有有效键,我会使用它,因为它可以确保您始终使用有效值。

它还可以避免混淆,因为 String 可以用于很多事情,并且很容易将“Animal”字符串转换为用于其他用途的字符串。由于枚举类型通常不能与其他类型互换(除非您使用通用接口(interface)),因此编码出错的可能性较小。

关于java - 如果查找键是字符串,则 EnumMap 或 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10445274/

相关文章:

java - 确定二进制数的间隙长度

java - 编译器错误,变量nameOfMonth可能尚未初始化

c# - 使用 linq 将集合中的项目合并在一起

Java 8 流 - 合并共享相同名称且彼此关注的对象的集合

java - Java HashMap keySet() 迭代顺序是否一致?

java - CheckStyle 的行长检查是怎么回事?

java - 向 smali 源添加代码

java - Java Collections.sort(nodes) 使用什么类型?

java - 使用扫描仪扫描冒号之前的字符串部分和冒号之后的部分

java - 返回嵌套的 HashMap