方案一使用数组
一个数组存入10亿数据,第一位手机号一定为1则忽略。
如果存储的是String类型 存储10e个 需要9.5GB左右。
如果存储的是Long类型 存储10e个 需要7.5GB左右。
进行for循环运算效率很低,内存占用很大。
方案二使用HashSet
HashSet底层使用HashMap,需要记录hash值、value、key、next节点等各种各样的东西。消耗内存可想而知,20GB左右。
方案三BitMap
Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。
声明一个Bit数组
如果对应的数字存在 那么表示1,如果不存在表示0. 此时的BitMap数组内存为1.2G。
java.util.BitSet
而java中java.util.BitSet 来实现了 BitMap特性。
当存放10位手机号时会发现
因为BitSet中定义的是Integer这样已经超过了Integer.MAX_VALUE。
所以我们使用分桶理论
分桶理论
//电话号 135 2333 3222
BitSet bitSet = new BitSet();
bitSet.set(23333222);
Map<String,BitSet> map = new HashMap();
//当Key存在时,BiFunction一定会被执行
BitSet bitSet135 = map.computeIfAbsent("135", k -> bitSet);
System.out.println(bitSet135.get(23333222));
System.out.println(bitSet135.get(23333221));
从而所占用的内存只有360M