bitSet对那种海量无符号的整数,去重,统计,判断元素是否存在之类的比较高效。bitSet不需要存储元素本身
但是面对其他情况,比如处理url,则需要使用哈希函数将URL处理为1bit,存储在BitSet中。但是,哈希函数发生冲突的概率比较高,若要降低冲突概率到1%,就要将BitSet
的长度设置为URL个数的100倍。
package cn.kong.test; import java.util.BitSet; /** * BitSet类实现了一个按需增长的位向量。位Set的每一个组件都有一个boolean值。 * 用非负的整数将BitSet的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。 * 默认情况下,bitSet中所有位的初始值都是false。 */ public class BitSetTest { public static void main(String[] args) { int[] array = new int[]{1,2,3,16,0,3,61}; // BitSet的底层实现是使用long数组作为内部存储结构的,所以BitSet的大小为long类型大小(64位)的整数倍。 // BitSet有两个构造函数: // 1、BitSet():创建一个bitSet,默认容量大小是64位。 // 2、BitSet(int nbits):创建一个bitSet,它的初始大小表示索引(index)范围在0到nbits-1的位。 BitSet bitSet = new BitSet(); System.out.println(bitSet.size());//64 BitSet bitSet1 = new BitSet(1);//index范围0-1,使用1个bit位,也是要分配一个long类型,64位的空间 System.out.println(bitSet1.size());//64 BitSet bitSet2 = new BitSet(65);//index范围0-65,1个long表示不了,所以要分配2个long,也就是128位 System.out.println(bitSet2.size());//128 BitSet bitSet3 = new BitSet(23);//index范围0-23,1个long可以表示,分配一个即可,所以64位 System.out.println(bitSet3.size());//64 for (int i = 0; i < bitSet3.size(); i++) { System.out.println(bitSet3.get(i));//在没有赋值之前,所有位的初始值都是false } //赋值测试 for (int value : array) { //bitSet的index0-63位表示值0-63 //不能赋负值 //赋值以后将位对应的值设置为true bitSet1.set(value, true); } System.out.println(bitSet1.get(4));//false System.out.println(bitSet1.get(16));//true System.out.println(bitSet1.get(61));//true System.out.println("遍历bitSet1"); for (int i = 0; i < bitSet1.size(); i++) { System.out.println(bitSet1.get(i)); } } }
遍历bitSet1 true true true true false false false false false false false false false false false false true false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false true false false