Java 枚举与对象

Java 枚举与对象,java,oop,enums,hashmap,Java,Oop,Enums,Hashmap,我正在使用HashMap创建一个“模拟词典”,其中的关键字是用户想要搜索的单词,例如“dog”或“bike”。简单来说,第二个值是定义。该定义还将进一步细分为每个适用词类(即动词/名词/形容词)的不同定义。 但是,我想知道像HashMap这样的操作与HashMap之间的性能差异是什么 基本上,我不明白为什么我们有对象时需要枚举,以及什么时候在对象上使用枚举更好,反之亦然。我在其他论坛上读过关于枚举如何更干净、更易于阅读的文章,但我没有看到任何关于何时创建枚举类而不是仅仅使用对象的内容 代码只是一

我正在使用HashMap创建一个“模拟词典”,其中的关键字是用户想要搜索的单词,例如“dog”或“bike”。简单来说,第二个值是定义。该定义还将进一步细分为每个适用词类(即动词/名词/形容词)的不同定义。 但是,我想知道像HashMap这样的操作与HashMap之间的性能差异是什么

基本上,我不明白为什么我们有对象时需要枚举,以及什么时候在对象上使用枚举更好,反之亦然。我在其他论坛上读过关于枚举如何更干净、更易于阅读的文章,但我没有看到任何关于何时创建枚举类而不是仅仅使用对象的内容

代码只是一个示例:

类字典{
公共枚举词{
狗(“名词定义”),
自行车(“名词定义”、“动词定义”);
//构造函数、私有变量和getter方法
}
私有静态void Main(){
//使用for()循环添加所有要映射的键/值
哈希映射
}
}
VS

类字典单词{
//定义的私有变量
//对象的构造函数
//私有变量的getter方法
公共静态void main(){
字典狗=新字典(“名词定义”);
字典自行车=新字典(“名词定义”、“动词定义”);
//使用for()循环添加所有要映射的键/值
哈希映射
}

对于一组固定的小型相关对象实例,枚举是一个很好的选择

  • 很小,因为您必须在单个类文件中列出每个类
  • 已修复,因为枚举不可变或不可扩展。它们是在编译时设置的
  • 相关,因为理想情况下,您希望围绕实例开发一个共享API。Java枚举功能非常强大,因为它们可以实现行为,而其他语言中的枚举只是常量值的枚举

  • 字典中的单词不能很好地符合这些标准。

    枚举用于预定义(在程序启动之前您已经知道它们)、静态(它们不经常或根本不改变)、一小部分相关的“项”。 例如“行星”(水星、金星、地球等)或卡片套装(心形、钻石等)。在循环或迭代中使用枚举通常看起来比使用自定义类“更清晰”:

        enum Planets {Mercury, Venus, Earth};
    
        for (Planets planet: Planets.values()) {
            // do something with the planet
        }
    

    另一方面,如果希望动态增加字典条目(通过让用户输入值或从数据库读取值),则不能使用枚举,而必须将类作为新实例(对象)使用可以动态创建。

    在使用HashMap的上下文中,Enum和Object应该提供类似的性能,因为HashMap的底层实现是获取一个hashKey并计算出相应的返回值,所以一旦获得Enum或Object的哈希值,它们的差异就结束了

    如果您正在寻找一些显著的性能提升,那么对于您可以研究的枚举,它们是专门为枚举键设计的&内部使用数组来存储数据,因此为您提供了一些性能提升。我不确定您将处理多大的字典,因此您将从
    EnumMap


    我坚持使用对象或字符串作为键将使您的字典具有更好的可管理性和灵活性。用Enum编写整个字典听起来很烦人,因为在字符串键中,您可以从某些文件读取数据并动态创建字典。

    当您玩游戏时,需要低、中、高或y级别时,Enum非常有用你有一个音乐播放器,你需要低、中、高的音乐音量。它像这些状态一样使用,创建枚举比对象更容易。

    你可以在任何时候使用枚举类型来表示一组固定的常量

    如何使用Java枚举 当变量(尤其是方法参数)只能从一小部分可能值中选取一个时,可以使用枚举。例如一周中的几天(星期日、星期一等),或方向(北、南、东、西)


    如果类应该具有固定的可枚举实例数,则可以使用枚举而不是类。

    我同意@Ekamjit(+1),我只在其答案中添加了以下内容:通过他的键使用
    哈希映射访问值的成本是O(1)如果您的
    hasCode
    实现为不同的键生成了太多次相同的值(在
    String
    的情况下很少会发生这种情况),那么情况只会变得更糟。我找到了一个更详细的答案,可以帮助你更好地理解我的小技巧。

    enum
    s当你有可枚举的东西时,比如一个过程的可能状态是有意义的。当然不是字典的条目。这非常有帮助,也非常简单。你有其他我可以进一步了解的链接吗你的意思是“3”。非常感谢!考虑一下EnUM实现接口的任何场景。接口是一个共享API,而枚举恰好是一组相关的实现。
    class DictionaryWords{
    
      //private variables for defintions
      //constructors for objects
      //getter methods for private variables
    
      public static void main(){
     
        Dictionary Dog = new Dictionary("noun definition");
        Dictionary Bike = new Dictionary("noun definition", "verb definiton");
    
        //use a for() loop to add in all the keys/values to map
        HashMap<Object_Name, Object_GetterMethod> 
    
    }
    
        enum Planets {Mercury, Venus, Earth};
    
        for (Planets planet: Planets.values()) {
            // do something with the planet
        }