我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java怎么快速判断元素是否在集合里

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java怎么快速判断元素是否在集合里

今天小编给大家分享一下java怎么快速判断元素是否在集合里的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1、什么叫布隆过滤器

布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于1970年提出的。

实际上可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。

它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

java怎么快速判断元素是否在集合里

2、实现原理

先来一张图

java怎么快速判断元素是否在集合里

 布隆过滤器算法主要思想就是利用 n 个哈希函数进行 hash 过后,得到不同的哈希值,根据 hash 映射到数组(这个数组的长度可能会很长很长)的不同的索引位置上,然后将相应的索引位上的值设置为1。

判断该元素是否出现在集合中,就是利用k个不同的哈希函数计算哈希值,看哈希值对应相应索引位置上面的值是否是1,如果有1个不是1,说明该元素不存在在集合中。

但是也有可能判断元素在集合中,但是元素不在,这个元素所有索引位置上面的1都是别的元素设置的,这就导致一定的误判几率(这就是为什么上面是活可能在一个集合中的根本原因,因为会存在一定的 hash 冲突)。

注意:误判率越低,相应的性能就会越低。

3、作用

布隆过滤器是可以用于判断一个元素是不是(可能)在一个集合里,并且相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。

注意上面的一个词:可能。这里先预留一个悬念,下文会详细分析到。

判断给定数据是否存在

防止缓存穿透(判断请求的数据是否有效避免直接绕过缓存请求数据库)等等、邮箱的垃圾邮件过滤、黑名单功能等等。

4、具体实现

看完了布隆过滤器的算法思想,那就开始具体的实现的讲解。

我先来举个例子,假设有旺财和小强两个字符串,他们分别经过三次的 hash 算法,然后根据 hash 的结果将对应的数组(假设数组长度为 16)的索引位置的值置为1,先来看下旺财这个词组:

java怎么快速判断元素是否在集合里

旺财经过三次 hash 过后,值分别为2,4,6 那么根据可以得到索引值分别为 2、4、6,于是就将该数组的索引(2、4、6)位置的值置为1,其余当做是0,现在假设需要查找旺财 ,同样经过这个三个hash 然后发现得到的索引 2、4、6对应的位置的值都为1,那么可以判断旺财可能是存在的。

接着有将小强插入到布隆过滤器中,实际的过程和上面的一样,假设得到的下标是 1、3、5

java怎么快速判断元素是否在集合里

抛开旺财的存在,小强此时是这样子在布隆过滤器中的,结合旺财和小强实际的数组是这样子的:

java怎么快速判断元素是否在集合里

 现在有来一个数据:9527,现在要求是判断 9527 是否存在,假设9527 经过三次 hash 过后得到的下标分别为:5、6、7。结果发现下标为 7 的位置的值为0,那么可以肯定的判断出,9527 一定不存在。

接着又来了一个 国产007,经过三次 hash 过后得到的下标分别为:2、3、5,结果发现 2、3、5下标对应的值全是1,于是可以大致判断出 国产007可能存在。但是实际上经过我们刚刚的演示,国产007 根本就不存在,之所以 2、3、5 索引位置的值为1 ,那是因为其他的数据设置的。

说到这里,不知道大家有没有明白布隆过滤器的作用。

5、代码的实现

作为 java 程序员,我们真的是很幸福了,我们使用到很多的框架和工具,基本都被封装好了,布隆过滤器,我们就使用 google 封装好的工具类。当然还有其他方法,大家可以探索探索。

首先添加依赖

<!--布隆过滤依赖--><dependency>    <groupId>com.google.guava</groupId>    <artifactId>guava</artifactId>    <version>25.1-jre</version></dependency>

代码的实现

import com.google.common.hash.BloomFilter;import com.google.common.hash.Funnels;import java.nio.charset.Charset;public class BloomFilterDemo {        public static void main(String[] args) {                BloomFilter<CharSequence> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf-8")), 100000000, 0.0001);        bloomFilter.put("死");        bloomFilter.put("磕");        bloomFilter.put("Redis");        System.out.println(bloomFilter.mightContain("Redis"));        System.out.println(bloomFilter.mightContain("Java"));    }}

 具体的解释已经写在注释中了。到这里相信大家一定明白了布隆过滤器和其怎么使用了。

6、实战

我们来模拟这样的场景:通过布隆过滤器来解决缓存穿透。

首先你的知道什么叫缓存穿透吧?

缓存穿透是指用户访问一个缓存和数据库中都没有的数据,因为缓存中不存在,所以就会去访问数据库,如果并发很高。很容易会击垮数据库

那布隆过滤器是如何解决这个问题的呢?他

的原理是这样子的:将数据库中所有的查询条件,放入布隆过滤器中,当一个查询请求过来时,先经过布隆过滤器进行查,如果判断请求查询值存在,则继续查;如果判断请求查询不存在,直接丢弃。

其代码如下:

String get(String key) {    String value = redis.get(key);         if (value  == null) {        if(!bloomfilter.mightContain(key)){            return null;         }else{            value = db.get(key);             redis.set(key, value);         }        }    return value;}

以上就是“java怎么快速判断元素是否在集合里”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java怎么快速判断元素是否在集合里

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java怎么快速判断元素是否在集合里

今天小编给大家分享一下java怎么快速判断元素是否在集合里的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、什么叫布隆过滤器
2023-06-29

python怎么判断元素是否在列表里

在Python中,可以使用in关键字来判断一个元素是否存在于一个列表中。下面是一个例子:my_list = [1, 2, 3, 4, 5]element = 3if element in my_list:print("元素存在于列表中
2023-10-24

java怎么判断元素是否在列表中

在Java中,可以使用List的contains()方法来判断一个元素是否在列表中。contains()方法会返回一个boolean值,如果列表中包含该元素,则返回true,否则返回false。以下是一个例子:javaimport java
2023-10-20

java中怎么判断某元素是否在数组中

java中判断某元素是否存在数组中的方法:1、通过将数组转换成List,然后使用List中的contains进行判断其是否存在public static boolean useList(String[] arr,String containValue){
java中怎么判断某元素是否在数组中
2017-01-30

java怎么判断数组元素是否重复

Java中判断数组元素是否重复可以使用以下方法:1. 使用两层循环遍历数组,比较每对元素是否相同。如果找到相同的元素,则数组中存在重复元素。```javapublic static boolean isDuplicate(int[] arr
2023-09-22

使用JavaScript怎么判断元素是否存在

这篇文章给大家介绍使用JavaScript怎么判断元素是否存在,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JavaScript是什么JavaScript是一种直译式的脚本语言,其解释器被称为JavaScript引擎,
2023-06-14

java数组怎么判断是否包含某元素

可以使用循环遍历数组,逐个比较数组中的元素是否与目标元素相等,如果有相等的元素,则认为数组包含该元素。以下是一个示例代码:public class Main {public static void main(String[] args)
2023-10-25

Java怎么判断数组是否有重复元素

可以使用两种方法来判断一个数组是否有重复元素。方法一:使用双层循环遍历数组public static boolean hasDuplicate(int[] arr) {for (int i = 0; i 方法二:使用Set集合pub
2023-10-26

怎么用Go判断元素是否在切片中

这篇文章主要介绍“怎么用Go判断元素是否在切片中”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用Go判断元素是否在切片中”文章能帮助大家解决问题。1.问题如何判断元素是否在切片中,Golang
2023-07-02

vue怎么判断元素是否在可视区域

三种方法:1、利用offsetTop和scrollTop获取元素的位置,判断是否小于等于viewPortHeight(视图端口距离)即可。2、利用getBoundingClientRect()判断,语法“元素对象.getBoundingClientRect()”。3、利用IntersectionObserver判断,只需要检查指定元素和可视区域是否重叠即可。
2023-05-14

c语言怎么判断元素是否在数组中

在C语言中,可以通过遍历数组的每个元素来判断一个元素是否在数组中。以下是一个示例代码:#include int isElementInArray(int arr[], int size, int element) {for (int i
2023-10-24

php怎么判断元素是否在二维数组中

判断步骤:1、使用foreach语句循环遍历二维数组的外层数组元素,语法““foreach($arr as $v){//循环体代码}””;2、在循环体中,利用“if(is_array($v)){if(array_search(元素值,$v)){//指定元素在二维数组中}}else{if($v===元素值){//指定元素在二维数组中}}”语句判断指定元素是否在二维数组中。本教程操作环境:windows
2022-07-11

怎么在python中判断两个集合是否相等

怎么在python中判断两个集合是否相等?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、说明可以使用 == 运算符判断两个集合是否相等(包含相同的元素),即判断集合 a 和集
2023-06-15

Python怎么判断一个整数数组是否存在重复元素

本篇内容主要讲解“Python怎么判断一个整数数组是否存在重复元素”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么判断一个整数数组是否存在重复元素”吧!问题:给定一个整数数组,你如
2023-06-02

java中怎么使用CollectionUtils工具类判断集合是否为空

本篇内容介绍了“java中怎么使用CollectionUtils工具类判断集合是否为空”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用Co
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录