java中的Bitset

什么是Bitset

Bitset,也就是位图,由于可以用非常紧凑的格式来表示给定范围的连续数据而经常出现在各种算法设计上。

基本原理是,用1位来表示一个数据是否出现过,0为没有出现过,1表示出现过。使用的时候既可根据一个是否为0表示此数是否出现过。

1G的空间,有8*1024*1024*1024=8.58*10^9 bit,也就是可以表示85亿个不同的数。

以下内容来自JDK API:

Bitset类实现了一个按需增长的位向量。它的每一个组件都有一个boolean值。用非负的整数将BitSet的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或和逻辑异或操作,可以使用一个BitSet修改另一个BitSet的内容。

默认情况下,set中所有位的初始值都是false。

每个位set都有一个当前大小,也就是该位set当前所用的空间的位数。注意,这个大小与位set的实现有关,所以它可能随实现的不同而更改。位set的长度与位set的逻辑长度有关,并且是与实现无关而定义的。

除非另行说明,否则将null参数传递给BitSet中的任何方法都将导致NullPointerException。

在没有外部同步的情况下,多个线程操作一个BitSet是不安全的。

Bitset的使用场景

常见的应用是那些需要对海量数据进行一些统计工作的时候,比如日志分析、用户数统计等等。

如统计40亿个数据中没有出现的数据,将40亿个不同数据进行排序等。

代码例子

posted @ 2020-06-19 13:27  johnny_zhao  阅读(414)  评论(0编辑  收藏  举报