java.util.BitSet的使用
程序员文章站
2024-03-15 21:56:12
...
BitSet顾名思义即Bit的一个集合,每个Bit只能取1或0(True或False),是存储海量数据一个途径。
而实际上BitSet内部核心是一个long的数组.
由于一个long在java中占用8个字节,即64位.
由于一个int在java中占用4个字节,即32位.
long[] result
result[0] 则可以保存
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
到
11111111 111111111 111111111 111111111 111111111 111111111 111111111 111111111
package main.lqk;
import org.junit.Test;
import java.util.BitSet;
import java.util.Date;
import java.util.Random;
/**
* 有1千万个随机数,随机数的范围在1到1亿之间。
* 现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来?
*/
public class BitSetTest2 {
public static final int NUM = 10000000;//10;
public static final int NUM2 = 10 * NUM;
@Test
public void test() {
int[] input = new int[NUM2 + 1];
Random random = new Random();
for (int i = 1; i < NUM + 1; i++) {
input[random.nextInt(NUM2) + 1] = 1;
}
for (int i = 1; i < NUM2 + 1; i++) {
if (input[i] == 0)
System.out.println(i);
}
}
@Test
public void test2() {
Boolean[] input = new Boolean[NUM2 + 1];
Random random = new Random();
for (int i = 1; i < NUM + 1; i++) {
input[random.nextInt(NUM2) + 1] = true;
}
for (int i = 1; i < NUM2 + 1; i++) {
if (input[i] == false)
System.out.println(i);
}
}
@Test
public void test3() {
BitSet input = new BitSet(NUM2 + 1);
Random random = new Random();
for (int i = 0; i < NUM + 1; i++) {
if(i % 1000000 == 0)System.out.println(new Date());
input.set(random.nextInt(NUM2) + 1);
}
System.out.println();
int j = 1;
for (int i = 1; i < NUM2 + 1; i++) {
if (!input.get(i)) {
if (j++ % 10 != 0)
System.out.print(i + ",");
else {
j = 1;
System.out.println(i);
}
}
}
}
}
上一篇: 快速查找一个数字是否出现在40亿个数字中
下一篇: 海量数据处理(3):布隆过滤器