Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在这种情况下,为什么enum比HashMap更有用?_Java_Class_Enums_Hashmap - Fatal编程技术网

Java 在这种情况下,为什么enum比HashMap更有用?

Java 在这种情况下,为什么enum比HashMap更有用?,java,class,enums,hashmap,Java,Class,Enums,Hashmap,这似乎是一个常见的问题,但建议框中的任何项目都不能准确解释我的疑问。在中,每个人都建议使用枚举类型(我现在已经研究过了,但以前从未使用过)。我打算简单地建议使用HashMap并阅读答案,看看Enum()是否是一个更好的答案。根据oracle上的链接,“在任何时候需要表示一组固定的常量时,都应该使用枚举类型。”因此,事实确实如此 我的问题是。。。为什么?他们不会改变的更多的是签订合同吗?这是获得某些类功能的较短方法吗?演出怎么样?为什么这和在同一个类中定义常量有什么不同 谢谢大家! 在我看来,它们

这似乎是一个常见的问题,但建议框中的任何项目都不能准确解释我的疑问。在中,每个人都建议使用枚举类型(我现在已经研究过了,但以前从未使用过)。我打算简单地建议使用HashMap并阅读答案,看看Enum()是否是一个更好的答案。根据oracle上的链接,“在任何时候需要表示一组固定的常量时,都应该使用枚举类型。”因此,事实确实如此

我的问题是。。。为什么?他们不会改变的更多的是签订合同吗?这是获得某些类功能的较短方法吗?演出怎么样?为什么这和在同一个类中定义常量有什么不同


谢谢大家!

在我看来,它们只是更快地声明和使用,而且,asn oracle说,它们更适合常量。枚举无法修改,因此我猜它们的资源使用量较小。

枚举实例是对象,与任何其他对象一样封装数据和行为。通过传递枚举实例,任何人都可以调用其方法。例如,如果将贴图键作为字符串传递,则无法使用该键执行任何有用的操作。此外,代码的类型安全性较低,自文档性也较低,因为字符串很可能完全不同于它应该是什么

最具可读性的是什么

public int countDays(Set<Month> months, int year) {
    int count = 0;
    for (Month month : months) {
        count += month.getDays(year);
    }
    return count;
}
public int countDays(设置月份,int年){
整数计数=0;
用于(月:月){
计数+=月.天(年);
}
返回计数;
}

public int countDays(设置月份,int年){
整数计数=0;
用于(字符串月份:个月){
int days=monthMap.get(月);
如果(月等于(月等于2月)){
天数=2月(年)的计算日;
}
计数+=天;
}
返回计数;
}

如果我在集合中传递的不是月份名称,该怎么办

你说的所有理由都非常正确

枚举更高效,因为它存储为一个不可变的值列表,并且不必像字典那样支持很多操作。此外,枚举实例只是作为单个数字存储在内部,可以像定义自己的“静态最终整数”列表一样使用

此外,它们还增加了类型安全性,因为您不必担心将实际数值与表示某个选项的整数进行比较;枚举只能与其他枚举进行比较。它也不能像字典那样修改,所以您知道在编译时给出的值在运行时是相同的


但是,我认为,最重要的原因是它增加了语义价值。这正是枚举的目的——定义一组不变的选项,并将自己限制为仅使用这些选项。如果您使用枚举,每个人都能直观地理解您要做什么。

类型安全确实是一个很好的理由:当您将字符串传递给方法时,它可以是任何内容。如果传递枚举,则确定它是合法值之一。如果可能性集有限,枚举是好的。如果需要扩展值,哈希映射很好。

枚举是一种非常有限的数据类型,它允许您将可能的值限制在一个集合中,并在编译时避免其他值,因此如果您出错,它甚至不会编译。HashMap可以让您插入许多无效值,只要努力,它们可以在运行时被检测到,但它当然会编译

hashmap使用了大量内存,即使您有固定时间的查找和插入,仍然需要完成一定程度的处理。必须计算散列,然后必须解决冲突的插槽等。。。而枚举通常只存储在4个字节中,是类型安全的,是有效的,并且对于其他程序员来说,使用它的目的是显而易见的


另一个好处是,可以轻松地在枚举值之间使用位算术来表示其他值。windows API经常这样做

这应该是答案。解释得很清楚。
public int countDays(Set<String> months, int year) {
    int count = 0;
    for (String month : months) {
        int days = monthMap.get(month);
        if (month.equals(Months.FEBRUARY)) {
            days = computeDaysInFebruary(year);
        }
        count += days;
    }
    return count;
}