bitMap实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.yzw.arithmetic.first;

import java.util.HashSet;
import java.util.Random;

public class BitMap {

private long[] bytes = null;

public BitMap(int max) {
/*当我们往里添加数据的时候至少需要 1个长度的数字
long类型的大小为8个字节即64
所以long数组开始的大小为 ((max + 64) >> 6) = ((max + 64) / 64)*/
bytes = new long[((max + 64) >> 6)];
}

public void add(int number) {
// number >> 6 = number/64 这一步是为了找到 number的位置
// number & 63 = number % 63 这一步是为了 number的位置所在位置的第几位
// (1L << (number & 63))就是 只有(number & 63)位上是1 0001000
// bytes[number >> 6] |= (1L << (number & 63)); bytes[number >> 6] = bytes[number >> 6] | bytes(1L << (number & 63));
// | 解释 有1它就是1
bytes[number >> 6] |= (1L << (number & 63));
}

public void del(int number) {
//number & 63 --> number % 64
// ~ 0001000 1110111
// & 有0则为0
bytes[number >> 6] &= ~(1L << (number & 63));
}

public Boolean countains(int number) {
return (bytes[number >> 6] & (1L << (number & 63))) != 0;

}

//对数器
public static void main(String[] args) {
int max = 900000;
BitMap bitMap = new BitMap(max);
HashSet<Integer> hashSet = new HashSet<>();
for (int i = 0; i < max; i++) {
double random = Math.random();

int i1 = new Random().nextInt(max);

if (random < 0.3333) {
bitMap.add(i1);
hashSet.add(i1);
}

if (random > 0.3333 && random < 0.6666) {
bitMap.del(i1);
hashSet.remove(i1);
}

if (random > 0.6666) {
if (bitMap.countains(i1) != hashSet.contains(i1)) {
System.out.println("出错了");
}
}

}
hashSet.forEach(v -> {
if (!bitMap.countains(v)) System.out.println("出错了");
});


}

}