版权声明:本文为博主原创文章,如需转载请注明原文出处: https://blog.csdn.net/u010979642/article/details/91128400
set 集合实现查找
将1 亿个数存储在 set 集合内, 然后根据 contains 方法来判断该整数是否存在集合中即可。
bitmap 位图实现查找
程序实现
public class AnswerApp {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
BitSet bitSet = new BitSet(Integer.MAX_VALUE);
int count = 1 << 27;
System.out.println("本次要在 " + count + " 个数中进行查看某个整数是否在其中");
System.out.println();
System.out.println("加载数据到内存中...\n");
// 随机生成 Integer.MAX_VALUE 以内的 count 个整数
for (int i = 0; i < count; i++) {
bitSet.set(new Random().nextInt(Integer.MAX_VALUE));
}
System.out.println("加载数据到内存耗时: " + (System.currentTimeMillis() - startTime) + " ms.");
startTime = System.currentTimeMillis();
System.out.println();
System.out.println("查找中...");
System.out.println("bitSet 的总大小: " + bitSet.length());
System.out.println();
System.out.println("整数 1024 是否在" + count +"个数当中: " + bitSet.get(1024));
System.out.println("整数 20190607 是否在" + count +"个数当中: " + bitSet.get(20190607));
System.out.println();
// 把整数 20190607 放到数字容器中
bitSet.set(20190607);
// 此时再看 20190607 是否存在数字容器内
System.out.println("整数 20190607 是否在" + count +"个数当中: " + bitSet.get(20190607));
System.out.println();
// 把整数 20190607 从数字容器内移除
bitSet.set(20190607, false);
// 此时再看 20190607 是否存在数字容器内
System.out.println("整数 20190607 是否在" + count +"个数当中: " + bitSet.get(20190607));
System.out.println();
System.out.println("查找数据耗时: " + (System.currentTimeMillis() - startTime) + " ms.");
}
}
运行输出
本次要在 134217728 个数中进行查看某个整数是否在其中
加载数据到内存中...
加载数据到内存耗时: 21029 ms.
查找中...
bitSet 的总大小: 2147483641
整数 1024 是否在134217728个数当中: false
整数 20190607 是否在134217728个数当中: false
整数 20190607 是否在134217728个数当中: true
整数 20190607 是否在134217728个数当中: false
查找数据耗时: 0 ms.
两种方式占用内存对比
-
采用 set 集合实现, 1亿个int类型整数占用空间是 4亿字节 大约是 400MB
- 1亿 int 整数 = 4字节 * 1 亿 = 4亿字节
-
采用位图实现, 因为 一个int 类型是32位, 所以占用的空间是 set 方式的 1/32, 即 400/32=12.5MB
换算规则
-
1GB = 1024MB =
1024 * 1024 KB
=1024 * 1024 * 1024 Byte
= 1073741824 字节约等于
十亿字节 -
int 值的取值范围 -2147483648(-2的31次方) ~ 2147483647(2的31次方 - 1)
-
1个 int 类型整数 = 二进制位数32位(bit) = 4字节(byte)