dtcms 源码 Ubuntu WEB视频自适应 CSS选择器 jquery pdo nlp sas jQuery Mobile Ractivejs angular视频教程 pmp视频教程 jmeter性能测试视频 jquery使用ajax 软件测试项目实战案例 mysql在线测试 android常用布局 kafka消费不到数据 oracle重命名表名 手动安装fastboot驱动 oracle分析函数 mysql重启 react python代码示例 python循环语句 javascanner java实现 java的运行环境 java基础课程 java获取现在时间 狮子狗出装 workflow中文 刷机工具下载 vnc客户端 iar下载 手机电脑模拟器 数组删除指定元素 jq改变css样式 foobar2000插件 cad文件
当前位置: 首页 > 学习教程  > 编程语言

BitSet----位操作对象

2020/11/4 14:10:03 文章标签:

BitSet是位操作的对象,值只有0或1即false和true,内部维护了一个long数组,初始只有一个long,所以BitSet最小的size是64,当随着存储的元素越来越多,BitSet内部会动态扩充,最终内部是由N个long来存…

      BitSet是位操作的对象,值只有0或1即false和true,内部维护了一个long数组,初始只有一个long,所以BitSet最小的size是64,当随着存储的元素越来越多,BitSet内部会动态扩充,最终内部是由N个long来存储,这些针对操作都是透明的。用1位来表示一个数据是否出现过,0为没有出现过,1表示出现过。使用用的时候既可根据某一个是否为0表示,此数是否出现过。一个1G的空间,有 8102410241024=8.5810^9bit,也就是可以表示85亿个不同的数。
注意:在没有外部同步的情况下,多个线程操作一个BitSet是不安全的。

 

例如:

比如有一堆数字,需要存储,source=[3,5,6,9]
用int就需要4*4个字节。
java.util.BitSet可以存true/false。
如果用java.util.BitSet,则会少很多,其原理是:
1,先找出数据中最大值maxvalue=9
2,声明一个BitSet bs,它的size是maxvalue+1=10
3,遍历数据source,bs[source[i]]设置成true.
最后的值是:
(0为false;1为true)
bs [0,0,0,1,0,1,1,0,0,1]
3, 5,6, 9
这样一个本来要int型需要占4字节共32位的数字现在只用了1位!
比例32:1
这样就省下了很大空间
通常用在数据统计、分析的领域。

 

为什么使用Long不使用int?

    JDK选择long数组作为BitSet的内部存储结构是出于性能的考虑,因为BitSet提供and和or这种操作,需要对两个BitSet中的所有bit位做and或者or,实现的时候需要遍历所有的数组元素。使用long能够使得循环的次数降到最低,所以Java选择使用long数组作为BitSet的内部存储结构。

    从数据在栈上的存储来说,使用long和byte基本是没有什么差别的,除了编译器强制地址对齐的时候,使用byte最多会浪费7个字节(强制按照8的倍数做地址对其),另外从内存读数组元素的时候,也是没有什么区别的,因为汇编指令有对不同长度数据的mov指令。所以说,JDK选择使用long数组作为BitSet的内部存储结构的根本原因就是在and和or的时候减少循环次数,提高性能。


本文链接: http://www.dtmao.cc/news_show_350096.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?