10亿手机号如何去重?(BitMap)

10亿手机号如何去重

  • 方案一使用数组
  • 方案二使用HashSet
  • 方案三BitMap
    • java.util.BitSet
    • 分桶理论

方案一使用数组

一个数组存入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数组

10亿手机号如何去重?(BitMap)_第1张图片
如果对应的数字存在 那么表示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

你可能感兴趣的:(java源码,算法,java,哈希算法,开发语言)