【问题标题】:Enums VS Objects枚举 VS 对象
【发布时间】:2023-03-16 00:25:01
【问题描述】:

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

基本上,我很困惑为什么当我们有对象时需要 ENUMS,以及何时在对象上使用 ENUM 更好,反之亦然。我已经阅读了其他论坛,了解 Enums 如何更简洁且易于阅读,但我没有看到关于何时创建 Enum 类与仅使用对象的任何信息?

代码只是一个例子:

class Dictionary{

  public enum Words{ 
     Dog("noun definition"),
     Bike("noun definition", "verb definiton");

     //constructors & private variables & getter methods
  }

  private static void Main() {

    //use a for() loop to add in all the keys/values to map
    HashMap<ENUM_Name, Enum_GetterMethod> 
  }
}

VS

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> 

}

【问题讨论】:

  • enums 在您拥有可枚举的事物时才有意义,例如过程的可能状态。肯定不是字典的条目。

标签: java oop enums hashmap


【解决方案1】:

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

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

字典单词并不特别适合这些标准。

【讨论】:

  • 这非常有用且简单。您是否有任何其他链接可以让我进一步理解您对#3 的意思。 ?非常感谢!
  • 考虑枚举实现接口的任何场景。该接口是一个共享 API,而枚举恰好是一组相关的实现。
【解决方案2】:

在使用 HashMap 的情况下,Enum 和 Object 应该给出相似的性能,因为 HashMap 的底层实现是获取一个 hashKey 并计算出相应的返回值,所以一旦你得到 Enum 或 Object 的 Hash 值,它们的区别就结束了。

如果您正在寻找一些显着的性能提升,那么对于枚举,您可以查看EnumMap,它们是专门为枚举键设计的,并且在内部使用数组来存储数据,从而为您提供一些性能提升。 Refer this for more info。我不确定您将处理多大的字典,因此您将从EnumMap 获得何种收益。

IMO 坚持使用对象或字符串作为键将为您的字典提供更好的可管理性和灵活性。用 Enum 写一个完整的字典听起来很烦人,而在 String 键中你可以从某个文件中读取数据并动态创建字典。

【讨论】:

    【解决方案3】:

    当你有一个游戏并且你需要低、中、高级别或者你有一个音乐播放器并且你需要音乐声音级别低、中、高时,枚举很有用它像这些状态一样使用并且创建枚举比对象更容易

    【讨论】:

      【解决方案4】:

      我同意@Ekamjit (+1) 的观点,我只在他的回答中添加以下内容:使用HashMap 通过他的键访问值的成本是 O(1),而且只会变得更糟如果您的hasCode 实现为不同的键生成了太多次相同的值(在String 的情况下很少会发生这种情况)。我找到了更详细的答案here,可以帮助您更好地理解我的小提示。

      【讨论】:

        【解决方案5】:

        枚举用于预定义(在程序启动之前您已经知道它们)、静态(它们不会经常或根本不会更改)、相关“项目”的小集合。 例如“行星”(水星、金星、地球……)或纸牌花色(红心、钻石……)。在循环或迭代中使用枚举通常看起来比使用自定义类“更清晰”:

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

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

        【讨论】:

          【解决方案6】:

          您可以在需要表示一组固定常量的任何时候使用枚举类型。

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

          如果类应该具有固定的可枚举实例数,您可以使用枚举代替类。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多