大家好,在最近的一次Java面试中,我的一个朋友被问到了Java中RegularEnumSet 和JumboEnumSet 的区别,不幸的是,他还没有很好地探索这个话题,不能准确地回答这个问题,但他之后一定会学习EnumSet 。当他和我讨论这个话题时,我非常喜欢,因为尽管EnumSet很有用,而且实现速度很快,但没有多少开发者知道它,尽管在Java经典的Effective Java中提到过。这让我写了这篇文章,我们将主要讨论Java中RegularEnumSet和JumboEnumSet之间的一些区别,但我们也会涉及EnumSet的一些重要属性。
对于那些完全不了解 EnumSet 并想知道这个新的Set实现是什么的人来说 ,它是一种非常特殊的实现,用于存储 Java Enum。
由于Enum总是有固定数量的实例,用于存储Enum的数据结构可以根据实例的数量进行优化,这就是为什么我们在Java中有两种不同的EnumSet的实现。我们将在下一段中仔细研究这个概念。
顺便说一下,如果你是Java编程领域的新手,不熟悉基本的Java API,那么我建议你加入Udemy的The Complete Java Masterclass课程。这个80小时的课程是在线深入学习Java的最佳途径。
EnumSet在Java中是如何实现的
EnumSet是一个抽象的类,它提供了两个具体的实现, java.util.RegularEnumSet和java.util.JumboEnumSet。RegularEnumSet和JumboEnumSet的主要区别是前者使用一个long变量来存储元素,而后者使用long[]来存储其元素。
由于RegularEnumSet使用一个long变量,它是一个64位的数据类型,它只能容纳那么多的元素。
这就是为什么当使用EnumSet.noneOf()方法创建一个空的EnumSet时,如果key universe(Key Enum中enum实例的数量)小于或等于64,它会选择RegularEnumSet,如果key universe大于64,则选择JumboEnumSet。
下面是做这个的代码。
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
.. ............
if (universe.length <= 64)
return new RegularEnumSet<E>(elementType, universe);
else
return new JumboEnumSet<E>(elementType, universe);
}
虽然这是一个相当低级的实现细节,但如果你在面试中碰巧问到同样的问题,了解它对面试官的印象是很好的。
顺便说一下,像Java集合框架这样的基本Java API的知识是非常重要的,不仅从面试的角度来看,而且从日常的Java开发工作来看也是如此。
初学者的EnumSet 101
现在让我们回顾一下EnumSet在Java中的一些重要属性
1.EnumSet不是线程安全的,这意味着当多个线程访问它并且其中一个线程修改Collection时,它需要进行外部同步。
2.EnumSet不能用来存储除Enum以外的任何其他对象,同时你也不能存储两个不同的Enum实例。
3.EnumSet不 允许Null 元素。
4.EnumSet 迭代器在本质上是失败安全的 。
以上就是关于Java中RegularEnumSet和JumboEnumSet的区别。正如我所说,这是一个非常有用的类,Joshua Bloch在《Effective Java》一书中也曾推荐过。EnumSet实现的美妙之处在于它们的创建方式。
这个类被特意包装成私有的,所以没有人可以创建EnumSet的实例。你只能通过使用API提供的不同工厂方法来创建EnumSet的实例。这允许API从RegularEnumSet和JumboEnumSet中选择,这取决于Enum实例的数量,即密钥大小。
这种安排也是非常可扩展和可管理的,因为你可以引入新的EnumSet实现而不破坏客户代码。
你可能喜欢的相关Java集合文章
-
我最喜欢的学习Java集合的课程(最佳课程)
-
Java中HashMap和Hashtable的5个区别(答案)
-
10门针对程序员的高级核心Java课程(高级课程)
-
如何在Java中按键对HashMap进行排序(例子)
-
在Java 8中如何按值对HashMap进行排序(例子)
-
5门适合初学者的免费Java编程课程(免费课程)
-
如何通过传值从HashMap中获取键(示例)
-
50多个Java集合面试问题及答案(问题)
-
10个Java中并发HashMap的例子(例子)。
-
Java中ConcurrentHashMap和HashMap的区别(答案)
-
21个Java程序员的HashMap面试问题(问题)
-
学习Java集合框架的5个最佳课程(课程)
-
在Java中对HashMap进行排序的2种方法?(例子)
-
Java中HashMap、LinkedHashMap和TreeMap的区别(答案)
非常感谢你到目前为止阅读这篇文章。如果你觉得这篇文章很有用,那么请与你的朋友和同事分享它。如果你有任何问题或疑惑,请随时提问。
