hashcode详解-程序员宅基地

技术标签: 算法  散列表  哈希算法  数据结构  

前言

HashCode是在Java中用于获取对象的唯一标识符的方法。它是根据对象的内容生成的一个整数值。对象的hashCode()方法被调用时,它返回的是对象的哈希码。哈希码可以用于在哈希表等数据结构中快速定位对象。

在Java中,hashCode()方法是被Object类定义的,所有的对象都可以调用该方法。默认情况下,hashCode()方法返回的是对象的内存地址的哈希码表示。

通常情况下,如果两个对象的equals()方法返回true,那么它们的hashCode()方法应该返回相同的值。这是为了确保在集合类(如HashMap、HashSet等)中能正确地工作。

如果你自定义的类需要使用equals()方法进行对象的比较,那么通常也需要重写hashCode()方法,保证它们的一致性。

你可以使用hashCode()方法来获取对象的哈希码,例如:

public class MyClass {
    
    private int id;
    private String name;

    // constructors, getters, setters, etc.

    @Override
    public int hashCode() {
    
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
}

在上面的例子中,hashCode()方法根据对象的id和name属性生成哈希码。这样,当两个对象的id和name属性相同时,它们的hashCode()方法会返回相同的值。

hash是随机生成的吗

哈希码的生成通常是根据对象的内容计算得出的,而不是随机生成的。在Java中,默认的hashCode()方法实现是根据对象的内存地址计算得到的一个整数值。这意味着,对于同一个对象,在其生命周期内,多次调用hashCode()方法应该返回相同的值。

然而,有时候我们会根据对象的内容来自定义hashCode()方法。在这种情况下,哈希码的生成过程可以依赖于对象的属性,并且根据具体的实现方式而有所差异。

重要的一点是,生成的哈希码应该尽可能地保持唯一性和均匀分布,以提高在哈希表等数据结构中的查找效率。这样可以尽量避免哈希冲突(即不同对象生成了相同的哈希码),从而提高性能。

需要注意的是,尽管哈希码是根据对象的内容计算得出的,但它并不保证对象的唯一性。不同的对象可能会生成相同的哈希码,这就是所谓的哈希冲突。为了解决哈希冲突,Java中提供了equals()方法进行对象的比较,当equals()方法返回true时,可以认为两个对象是相等的。

因此,在使用哈希码时,我们既需要考虑哈希码的计算方式,也需要正确实现equals()方法来确保对象的相等性判断。

hash碰撞

Set set = new HashSet();
        int hashCodeValue;

        for (int i = 1; i <= 150000; i++)
        {
    
            hashCodeValue = new Object().hashCode();

            if(set.contains(hashCodeValue))
            {
    
                //你新生成的刚好是我hashset里面已经有的,冲突发生....
                System.out.println("发生hash冲突,在第: "+i+" 次,hashCodeValue "+ hashCodeValue);
                continue;
            }else{
    
                set.add(hashCodeValue);
            }
        }
        System.out.println(set.size());

这段代码创建了一个HashSet并循环生成150,000个对象的哈希码,并将哈希码添加到HashSet中。如果生成的哈希码已经存在于HashSet中,则打印出哈希冲突的信息,继续下一个循环。最后打印HashSet的大小。java中在100000次内一般不会发生hash冲突(碰撞),在110000次中一般会发生一次hash冲突。上面代码中生成了150000次hashcode值,发生了五次冲突。java的安全性还是很厉害的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
(44-李四)覆盖(44-张三)
在这里插入图片描述
在这里插入图片描述
形成链表
在这里插入图片描述
在这里插入图片描述

依次比较
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_54794952/article/details/131824361

智能推荐

物联网IOT选型wifi路由模块串口透传不得不知的秘密_wifi透传与iot-程序员宅基地

文章浏览阅读1.2k次。2020年一场突如其来的疫情灾难袭来,各大经济市场在不同程度被按下了“暂停键”。物联网控制作为新兴行业优势凸显出来,其无接触式的交互方式,远程控制,智能控制车间,给疫情期间的人民带来安全、智能的生活体验。这些物联网控制大多用到了网关信息桥梁来传输—wifi 路由模块。但你知道吗?工程师们想要选择高性价比的wifi路由模块做串口透传,不得不知道wifi路由模块的两大区分:mcu+wifi模块和C..._wifi透传与iot

Ubuntu 17.10 + Cuda9.0 + CUDNN + Tensorflow最正确姿势排坑_cuda9.0 tensorflow1.7 ubuntu-程序员宅基地

文章浏览阅读4.3k次。 博主之前一直使用16.04与win10双系统,但是由于当初安装系统时候引导安装的有点问题,导致ubuntu使用起来一直有些毛病,搞了好久也没搞好,索性就想到干脆重新把系统装一下。作为一个爱尝鲜的用户,使用了这么长时间平平淡淡的长期稳定支持版,还是想要换换口味试试最新的17.10版本,不过鉴于长期支持版的18版本再过不久就会放出来了,估计17.10的寿命和用户数量也不会太多了,也正是这个原..._cuda9.0 tensorflow1.7 ubuntu

笔记_数学建模_数学模型-机器学习&机器学习常用算法_机器学习数学建模-程序员宅基地

文章浏览阅读481次。《数学模型-姜启源》——《机器学习》1、数学规划 (包括全部的规划问题)线性、非线性、动态规划、多目标规划、整数规划2、传染病模型(微分方程)3、稳定性模型包括捕鱼、人口、军事竞赛等等4、概率模型5、博弈模型6、计算机虚拟(数值模拟、动态仿真、蒙特卡罗算法)7、调度问题 (智能算法、遗传算法、多目标规划、数学规划、dijstra算法、Floyd算法)8、智能算法(遗传算法、模拟退火算法、蚁群算法、神经网络)9、微分方程所研究对象与已知因素之间可以用微分方程的形式表示(常微分方程(_机器学习数学建模

fine tune chatgpt_finetune embed chatgpt-程序员宅基地

文章浏览阅读2.1k次。fine tune openAI model ( 微调chatgpt)_finetune embed chatgpt

在stable diffusion中遇到以下问题应该如何解决“当前加载的模型是一个LORA,而不是一个稳定扩散检查点。RuntimeError:”_runtimeerror: the model currently loading is a lor-程序员宅基地

文章浏览阅读414次,点赞7次,收藏2次。如果上述步骤都不能解决您的问题,您可能需要更详细地描述您的代码和错误信息,以便于他人提供更具体的帮助。在描述问题时,请确保提供足够的细节,包括错误消息的完整内容、您使用的代码片段、以及您已经尝试过的解决方法。这可能意味着您尝试使用的模型或权重与您的代码或任务不兼容。如果您是从预训练模型开始,请确保您下载的是稳定扩散模型的权重,而不是其他类型的模型权重。检查您的代码中加载模型的部分,确保您使用了正确的类和方法来加载稳定扩散模型。确认您加载的模型文件确实是稳定扩散模型,而不是LORA模型。_runtimeerror: the model currently loading is a lora instead of a stable diff

error: macro "toLine" requires 2 arguments, but only 1 given      QLine toLine() const;_macro "_min" requires 2 arguments, but only 1 give-程序员宅基地

文章浏览阅读2.6k次。/include/qt/QtCore/qvariant.h:307:18: error: macro "toLine" requires 2 arguments, but only 1 given QLine toLine() const; ^include/qt/QtCore/qvariant.h:307:11: error: expected ‘..._macro "_min" requires 2 arguments, but only 1 given

随便推点

svc: failed to register lockdv1 RPC service (errno 111).-程序员宅基地

文章浏览阅读1.6k次。挂载时,用mount -t nfs 192.168.1.105:/ /mnt/nfs时出现svc: failed to register lockdv1 RPC service (errno 111)改为mount -t nfs -o nolock 192.168.1.105:/ /mnt/nfs就行了。全部配置步骤:1、进入配置文件,输_failed to register lockdv1 rpc service (errno 111)

python判断数字位数_Python中的位数,之,判断,数字-程序员宅基地

文章浏览阅读3.9k次。这里是一段防爬虫文本,请读者忽略。本文原创首发于CSDN,作者IDYS博客首页:https://blog.csdn.net/weixin_41633902/本文链接:https://blog.csdn.net/weixin_41633902/article/details/107440627未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!写在开头的话请记住:实践是掌握知识的最快方法如果..._python判断一个数是几位数

ImportError: cannot import name Template解决方案_importerror: cannot import name 'prompttemplate' f-程序员宅基地

文章浏览阅读6.2w次,点赞12次,收藏11次。本文主要介绍了ImportError: cannot import name Template解决方案,希望能对学习python的同学们有所帮助。文章目录1. 问题描述2. 原因分析3. 解决方案_importerror: cannot import name 'prompttemplate' from 'langchain.prompts.cha

Laravel随笔 Windows下Redis安装/php安装redis扩展_windows laravel 8使用 phpredis 扩展来连接 redis-程序员宅基地

文章浏览阅读164次。下载redis windows版 https://github.com/microsoftarchive/redis/releases (msi版本可以一键安装)PHP安装redis扩展 https://www.cnblogs.com/enjie/p/7978879.htmlPHP安装igbinary扩展 https://pecl.php.net/package/igbinary/3.1...._windows laravel 8使用 phpredis 扩展来连接 redis

同声传译免费软件app哪个好?让国际交流变得轻松又有趣-程序员宅基地

文章浏览阅读832次,点赞14次,收藏18次。软件能够实现几乎无延迟的语音翻译,让我们能够即时理解对方的意图并作出快速的回应。这一过程中,翻译结果的呈现流畅且准确,为我们提供了近乎无缝的跨语言交流体验。DeepL Translator的翻译结果准确度高,能够准确地把握原文的含义,避免了歧义和误解的产生。它拥有直观简洁的界面,操作简单方便。它采用了先进的语音识别和机器翻译技术,结合大量的语料库进行训练,确保翻译结果的准确性和流畅性。

一文详解opencv摄像头数字识别_摄像头数字识别在其他场景下识别不了-程序员宅基地

文章浏览阅读1.4w次,点赞32次,收藏286次。本文的目标是实现识别摄像头图像中的数字。实际应用场景包括 车牌号识别 ,部分竞赛的 A4纸打印数字识别 。摄像头数字识别分为两个步骤:1. 提取图像中的ROI区域,如截取车牌的矩形区域,或截取A4纸的图像。2. 对ROI区域进行数字识别。数字识别相对来说较为简单,先介绍数字识别的方法和原理。_摄像头数字识别在其他场景下识别不了

推荐文章

热门文章

相关标签