Java EnumSet工作原理初窥
EnumSet是Java枚举类型的泛型容器,Java既然有了SortedSet、TreeSet、HashSet等容器,为何还要多一个EnumSet<T>呢?答案肯定是EnumSet有一定的特性,举个例子,EnumSet的速度很快。其他特性就不一一列举了,毕竟本文的内容不是介绍EnumSet的特性。
首先以事实说话,存在这样一个EnumSet,它有50个枚举值T0~T49,将50个值插入到容器(HashSet、EnumSet)中,为一个操作,将50个枚举值移出做为第二个操作。把第一个和第二个操作执行的总时间设定为一个周期,拿HashSet操作的一个周期和EnumSet的一个周期做比较自然没什么意义,所以我们用50个周期的和做为比较,HashSet耗费9ms,EnumSet耗费4ms(这个结果只说明同样的操作EnumSet比HashSet更快,不做为其他参考依据,因为这个时间不是线程独占时间)。以下是代码和结果:
public class EnumSetTest{ private static EnumTest[] enumTestArr = EnumTest.values(); public static void main(String[] args) {
Set set = new HashSet<EnumTest>();
int i = 0;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
System.out.println("HashSet...Begin " + df.format(new Date()));
while (i <= 1000) {
addEnumerate(set);
removeEnumerate(set);
i++;
}
System.out.println("HashSet...End " + df.format(new Date())); EnumSet<EnumTest> enumSet = EnumSet.noneOf(EnumTest.class);
i = 0;
System.out.println("EnumSet...Begin " + df.format(new Date()));
while (i <= 1000) {
addEnumerate(enumSet);
removeEnumerate(enumSet);
i++;
}
System.out.println("EnumSet...End " + df.format(new Date()));
}
/*
* HashSet...Begin 2015-01-03 21:11:51.579
* HashSet...End 2015-01-03 21:11:51.588
* EnumSet...Begin 2015-01-03 21:11:51.589
* EnumSet...End 2015-01-03 21:11:51.593
* */ private static void addEnumerate(Set set) {
for (EnumTest t : enumTestArr) {
set.add(t);
}
} private static void removeEnumerate(Set set) {
for (EnumTest t : enumTestArr) {
set.remove(t);
}
}
}
那为什么EnumSet比较快呢,EnumSet是一个抽象方法,本次测试是用到的EnumSet的实现RegularEnumSet,RegularEnumSet add方法的源码如下:
public boolean add(E e) {
typeCheck(e); long oldElements = elements;
elements |= (1L << ((Enum)e).ordinal());
return elements != oldElements;
从Add方法的源码可以看出add方法实际只是对长整型数据element做了一个操作,也就是说EnumSet实际上将枚举值保存在一个长整型数据上。没个枚举值占用一bit。每次添加做的主要操作是1、类型检查 2、 添加枚举值 3、判断枚举值是否已经添加过了。
现在模拟一个场景来说明EnumSet工作原理。新建一个EnumSet(Set1),并向Set1中添加EnumTest.T3(ordinal:3),代码如下
EnumSet<EnumTest> set1 = EnumSet.noneOf(EnumTest.class);
set1.add(EnumTest.T3);
element本来有64个bit,这里就简略画了。这里有一个问题,就是枚举值的个数超过64个怎么办?超过64个了就用EnumSet的另一个实现JumboEnumSet。
本文到此就结束了,至于JumboEnumSet的工作原理和RegularEnumSet其他方法的工作原理请自行探索吧。所有源码都可以在http://grepcode.com/ 找到。
Java EnumSet工作原理初窥的更多相关文章
- 全面解读Java NIO工作原理(3)
全面解读Java NIO工作原理(3) 2011-12-14 10:31 Rollen Holt Rollen Holt的博客 我要评论(0) 字号:T | T JDK 1.4 中引入的新输入输出 ( ...
- 全面解读Java NIO工作原理(2)
全面解读Java NIO工作原理(2) 2011-12-14 10:31 Rollen Holt Rollen Holt的博客 我要评论(0) 字号:T | T JDK 1.4 中引入的新输入输出 ( ...
- Java虚拟机工作原理详解 (一)
一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 javac YourClassNam ...
- Java虚拟机工作原理详解
原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了 ...
- Java虚拟机工作原理具体解释
一.类载入器 首先来看一下java程序的运行过程. 从这个框图非常easy大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘其中.然后你在命令行中输入 javac YourClass ...
- Java虚拟机工作原理
Java虚拟机工作原理 首先我想从宏观上介绍一下Java虚拟机的工作原理.从最初的我们编写的Java源文件(.java文件)是如何一步步执行的,如下图所示,首先Java源文件经过前端编译器(javac ...
- java复习要点(一)------- java语言的特点、java的工作原理、配置环境变量、java命令的使用
一.java语言的特点: (1)简单并面向对象 (2)鲁棒并安全: java语言在编译及运行程序时,都要进行严格的检查,防止不匹配问题的发生.如果引用一个非法类型,或执行一个非法类型操作,java减肥 ...
- Java HashMap工作原理及实现
Java HashMap工作原理及实现 2016/03/20 | 分类: 基础技术 | 0 条评论 | 标签: HASHMAP 分享到:3 原文出处: Yikun 1. 概述 从本文你可以学习到: 什 ...
- 全面解读Java NIO工作原理(4)
全面解读Java NIO工作原理(4) 2011-12-14 10:31 Rollen Holt Rollen Holt的博客 我要评论(0) 字号:T | T JDK 1.4 中引入的新输入输出 ( ...
随机推荐
- 功放TAS5719耳机POP noise分析 对策
驱动功放时,遇到POP noise 是常见的问题,以前遇到此问题,首先想到的对策就是mute the output.本人一直来对此种解法感觉不爽,心里不快.最近遇到开机时耳机有很强的POP,决定好好研 ...
- [荐]推荐一个shell学习的网站
最近再用shell脚本,发现一个脚本学习的网站,非常好用,特此推荐一下. shell学习网站链接:http://c.biancheng.net/cpp/shell/
- Get query parameter from url
URL = { getUrlParams: function ( name, url ) { if (!url) url = window.location.href; name = name.rep ...
- Flexbox与Grid属性比较
网格容器(container)属性 网格项目(item)属性 Flex容器(container)属性 Flex项目(item)属性
- java模式
模式(Pattern) 模式(Pattern)的概念最早由建筑大师Christopher Alexander于二十世纪七十年代提出,应用于建筑领域,八十年代中期由Ward Cunningham和Ken ...
- fetch用法说明
语法说明 fetch(url, options).then(function(response) { // handle HTTP response }, function(error) { // h ...
- 安装git 配置邮箱和用户名
git 查看用户名和邮箱地址 $ git config user.email $ git config user.name 运行命令来配置你的用户名和邮箱 $ git config --global ...
- WARNING you have Transparen Huge Pages..
redis启动警告: WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will c ...
- 问题009:java当中的关键字有哪些?在Editplus文本编辑软件中是什么颜色的?java当中的标识符有什么要求?Java中注释分为几类?
(1) public 公共的,表示访问的权限 (2) private 私有的,表示一种访问权限 (3) class 类关键字,表示定义一个类 java中的关键字都是大写的还是小写的?小写的,在Edit ...
- linux替换yum源及配置本地源
linux系统安装后自带的bash源由于在国外,安装软件包的时候会非常慢,最好替换一下yum源. 关于yum源的简单介绍 yum的主要功能是更方便地添加,删除和更新rpmba ...