Java中BitSet简介说明
下文笔者讲述BitSet简介说明,如下所示
BitSet简介
BitSet
即位图
是一个很长的“0/1”序列
他只能存储0或1,他的数据按位存储,
采用这种模式导致Java中存储数比int节省空间
如:
一个int数存储只需4字节,32位
但是使用BitSet存放只需一位
如:
{2,4,6,8} 这四个数存储,需要4个int (32*4)bit
当我们使用bitSet,只需{...1,0,1,0,1,0,1],我们只需使用最大一个数的bit位即可
存储下这么多数字
BitSet简介:
BitSet初始大小为1个long的大小
即8字节64个bit
当我们创建BitSet指定位数
系统会根据情况取成64的整数倍个bit
即整数个long的位数
BitSet的使用场景
BitSet适合用于
无重复,整数
常用于大数据场景或日志统计
如:
当有10亿条URL中检测一个“www.java265.com/a” 是否存在,
如果我们使用hashmap来保存是不可取
因为URL本身需要占据较多的内存而无法直接操作
此时我们只能使用bitset来保存
我们只需计算一条URL的hashcode
并将数字映射在bitset上
则使用bitset上的一个位标识url存在性
BitSet原理
Java中
一个long型数字占用64位空间
那么一个long型数字(4个字节)可保存64个数字的“存在性”状态(无碰撞冲突时,即true、false状态)
如:
50个数字{0,1,10,…63},判定“15”是否存在
那么我们通常会首先将这些数字使用数组或hashmap保存
然后再去判定
那么保存这些这些数据需要占用64 * 64位
如果使用位图,那么一个long型数字即可
(如果换成50个字符串,那么其节约空间可能更大)
BitSet注意事项:
BitSet只能用于数字比较,如判断数字存在性
BitSet示例
BitSet bitSet = new BitSet(Integer.MAX_VALUE);//hashcode的值域 //0x7FFFFFFF String url = "http://java265.com/a"; int hashcode = url.hashCode() & 0x7FFFFFFF; bitSet.set(hashcode); System.out.println(bitSet.cardinality());//着色位的个数 System.out.println(bitSet.get(hashcode));//检测存在性 bitSet.clear(hashcode);//清除位数据
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


