JavaRush /Java 博客 /Random-ZH /关于 Java 中 Enum 的 15 个开发人员面试问题(附答案!)
Treefeed
第 21 级

关于 Java 中 Enum 的 15 个开发人员面试问题(附答案!)

已在 Random-ZH 群组中发布
枚举 ( Enum ) 是在Java 5中引入的,从那时起它在 Java 开发人员中变得非常流行。它广泛应用于各种Java应用程序中。由于 Java 中的 Enum 比 C 或 C++ 中的通用性更强,因此它还提供了许多有趣的用例,您可以在文章《在 Java 中使用 Enum 的 10 种方法》中看到其中的一些用例。但尽管如此受欢迎,许多 Java 程序员仍然不知道 Enum 提供的功能以及在 Java 代码中使用 Enum 的复杂性。 一些读者询问了这一点,例如 Enum 在 Java 中实现接口的能力,或者 为什么我们不能在 Enum 之外实例化 Enum,并指出他们在采访中被问到了这一点。这启发我们整理了 Java Enum 中的常见问题列表,不仅可以帮助您在面试中取得成功,还可以开辟新的学习途径。如前所述,面试问题通常会迫使您更认真地对待该主题,这并不是一件坏事,并且考虑到 Enum 的强大功能和实用性,是时候成为一名枚举大师了。下面是基于枚举的各种功能和属性的问题列表。您可以将其用作面试的准备材料或仅用作枚举指南。如果您是 Java 新手,您将学到很多关于 Enum 的新的有用的东西。 1)Enum可以实现Java中的接口吗? 是的, Enum可以继承接口。因为Enum类型类似于 接口,所以它可以继承接口。在某些情况下,这为使用 Enum 作为自定义实现提供了惊人的灵活性。 下面是使用 Enum 实现此功能的一个很好的示例。 2)Enum可以继承(扩展)类吗? 不他不能!出乎意料,因为之前说过Enum类型类似于Java中的类或接口。嗯,这就是为什么这个问题是在上一个问题之后提出的主要原因。由于 Enum 已经继承自抽象类 java.lang.Enum,很明显,另一个类将无法继承,因为 Java 不支持多类继承。通过继承 java.lang.Enum,所有枚举都具有 ordinal()values()valueOf()方法。 3)如何创建没有对象实例的Enum?这可能没有编译错误吗?这是面试官喜欢的 棘手问题 之一。由于枚举被视为一定数量对象的集合,例如 一周中的几天一年中的几个月,因此获得 没有任何内容的枚举似乎很可疑。但是,是的,您 可以创建一个没有实例的 Enum,例如通过创建实用程序类。这是使用 Enum 的另一种创新方式: public enum MessageUtil{ ; // required to avoid compiler error, also signifies no instance public static boolean isValid() { throw new UnsupportedOperationException("Not supported yet."); } } 4) 我们可以重写 Enum 的 toString() 方法吗?如果我们不覆盖会发生什么? 当然,您可以重写Enum 的 toString()方法 ,因为您可以重写任何继承 java.lang.Object并具有可用 toString()方法的类,即使您不这样做,您也不会丢失任何内容,因为抽象Enum 类的基类将为您执行此操作,并将返回名称,即 Enum 实例的名称。以下是Enum 类中 toString()方法的代码: 当编译器分配代码来创建枚举以响应在 Enum 类本身中创建实例以及在构造函数中创建序数时,指定 public String toString() { return name; } name java.lang.Enum class : protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } 这是 创建 enum 的唯一构造函数,由编译器调用以响应程序中 Enum 的声明。 5)我们可以在 Enum 之外实例化 Enum 吗?为什么不?无法在 Enum 范围之外实例化 Enum,因为 Enum 没有 public构造函数,编译器将不允许您引入任何此类构造函数。由于编译器生成大多数代码来响应 Enum 类型声明,因此它不允许Enum 中存在 公共构造函数,从而强制在内部声明 Enum 实例。 6) 我们可以在 Enum 中指定构造函数吗? 这个问题通常紧接着上一个问题。是的,可以,但请记住,这只能通过 私有包私有构造函数实现。Enum 中不允许使用 publicprotected构造函数。在这里你可以看到 一个例子。 7) 使用 == 或 equals() 方法比较 Enum 有什么区别? 这是一个非常广泛且棘手的问题,这里 将详细介绍。 8)ordinal()方法在Enum中做什么? ordinal() 方法返回 Enum 实例在 Enum 中指定的顺序。例如,在 DayOfWeek枚举中,您可以按顺序指定日期: public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } 如果我们调用 DayOfWeek.MONDAY.ordinal()方法,它将返回 0 - 这意味着第一个实例。此方法对于根据事物的实际状态提供顺序非常有用:即表明 TUESDAY(星期二)在 MONDAY(星期一)之后, WEDNESDAY(星期三)之前。同样,您可以使用枚举来表示一年中的月份,其中二月在一月之后但在三月之前。所有自定义枚举都从抽象类 java.lang.Enum继承此方法,并且它们由编译器通过调用 java.lang.Enum上的 受保护构造函数来设置,该构造函数采用名称和序数。 9) 在Java中是否可以将Enum与TreeSet或TreeMap一起使用? 这是一个非常有趣的枚举问题,人们喜欢问这个问题来测试他们的知识深度。在查看 java.lang.Enum代码之前,您可能不会知道 Enum 继承了 Comparable 接口,这是在 TreeSetTreeMap等有序集合中使用的关键要求。由于Enum默认继承 Comparable接口,因此它可以与 TreeSetTreeMap一起使用。 10) Enum 中的ordinal() 和compareTo() 有什么区别? 这直接来自上一个问题:事实上, compareTo()模拟了该方法提供的顺序 ordinal(),这是 Enum 的自然顺序。简而言之,Enum 按照声明的顺序限制比较。另外,值得记住的是,这些常量只能与相同类型的其他常量进行比较 - 比较不同类型的常量可能会导致编译器错误。 11)是否可以在 switch case 中使用 Enum? 是的你可以。此外,这是使用 Enum 的主要好处之一。由于 Enum 实例编译为临时常量,因此您可以安全地将它们注入 case 和 switch内。下面是一个包含星期几的代码示例: public void developerState(DayOfWeek today){ switch(today){ case MONDAY: System.out.println("Hmmmmmmmm"); break; case TUESDAY: System.out.println("Hmmmm"); break; case FRIDAY : System.out.println("Yeahhhhhh"); break; } } Enum 和 Switch 可以很好地互补,特别是当 Enum 包含少量稳定常量时,例如一周中的 7 天、一年中的 12 个月等。看看将 swith case与 Enum 结合使用的其他示例。 12)如何迭代整个Enum实例? 如果您打开过 java.lang.Enum,您就会知道 value()方法返回所有 Enum 常量的数组。由于每个枚举都继承 java.lang.Enum,因此它们都有一个 value()方法。使用它,您可以迭代特定类型的枚举的所有常量。查看使用 foreach循环和 value()方法进行此操作的 示例13)使用Enum作为单例有什么优点和缺点? Enum 提供了实现单例模式的 快速快捷方式,而且因为Effective Java 书中甚至介绍了它,所以它是一个流行的选择。乍一看,Enum 单例很有前途,而且相当方便,比如它控制实例化,可以安全地序列化,最重要的是,使用 Enum 可以轻松创建线程安全的单例。您不再需要担心双重检查变量的波动性。 在此处详细了解使用此方法的优点和缺点。 14) 使用 Enum 代替 int 枚举和 String 枚举模式有什么好处? 如果您已经编程超过 5 年并且仍在使用 JDK 1.3 或 1.4,您将熟悉 String 和 int 枚举模式,它们使用 public static final常量前缀来表示众所周知的固定值的集合许多事情,例如 一周中的几天。这里有很多问题:您没有 Enum 类型的独立性,因为负责星期几的 String变量可以采用任何任意值。同样,可枚举 int可以采用任何值,编译器会很乐意吞下它。并使用 Enum,您可以获得编译器为您检查的类型安全性。《Effective Java》中对此主题有一些有趣的想法,建议所有 Java 开发人员阅读。 15) 如何将字符串转换为枚举?由于在 Java 应用程序开发中使用 StringEnum 的流行,这是一个日常问题。 将Enum 转换为 String 的最佳方法是在 Enum 本身上定义一个工厂方法,该方法将采用 String参数并将其作为 Enum返回。您可能还希望忽略大小写。以下是一些将字符串转换为枚举的 示例。 关于 Enum 的 15 个问题(和答案)到此结束。 但请记住: 阅读不足以学习,它只是第一步。为了从枚举中受益,请尝试在项目中找到可以使用枚举的位置 - 这将为您提供真实的经验,并且通过这种经验,您将学到比示例更多的知识,因为您将遇到更多可以在更多情况下处理的问题复杂而详细的方式、要求。这些 关于 Enum 的问题值得关注,以测试您的知识,特别是如果您急于参加面试并且根本没有时间详细沉浸在 Enum 世界中。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION