它是一种二进制向量数据结构,用于判断一个元素 是否在集合中(判断某一个元素不在集合中有100%把握,判断元素在集合中 有一定的错误)。
原理:使用哈希函数将某一个元素映射到数组上,并不像HasMap存储对应元素,而是存储0/1 状态位。当有大量元素时很大的几率发生哈希冲突,因此可能影响它判断一个元素在集合中。比如有一个元素实际上不在集合中,但是标志位可能由于哈希冲突置为1导致判断出错。解决方案:使用多个哈希函数,对应多个点,当所有的位置都是1,表示它可能在集合中;反之,则一定不在集合中。
特定:1.它并不存储实际的元素,因此它非常节约空间
2.它使用数组存储,因此它可以用常数时间判断
3.它使用0/1存储状态,因此一定元素放入集合就无法删除,删除可能会导致其他元素的映射位置为0导致判断失误
应用:可以用于解决 缓存穿透问题:当请求的数据明显不存在时,使用这种方式过滤请求可以提高性能。
扩展:用于存储的数组从byte数组改成int数组, 增大状态的数量从而支持删除元素
技巧:要想保持错误率低,最好让位数组有一半还空着。
在错误率不大于є的情况下,m至少要等于n log2(1/є)才能表示任意n个元素的集合
这说明在哈希函数的个数取到最优时,要让错误率不超过є,m至少需要取到最小值的1.44倍。