首页 > 其他分享 >hashcode用途

hashcode用途

时间:2023-04-25 20:33:38浏览次数:35  
标签:相同 元素 equals 用途 hashCode 哈希 集合 hashcode



  总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。
  于是,Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。如果详细讲解哈希算法,那需要更多的文章篇幅,我在这里就不介绍了。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
  这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
  所以,Java对于eqauls方法和hashCode方法是这样规定的:
1、如果两个对象相同,那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同
  上面说的对象相同指的是用eqauls方法比较。
  你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。同时,增加新元素的效率会大大下降。

标签:相同,元素,equals,用途,hashCode,哈希,集合,hashcode
From: https://blog.51cto.com/u_16088628/6225039

相关文章

  • Java中为什么重写equals()也需要重写hashCode()?
    所有类默认继承Object类先看一下Object源码packagejava.lang;publicclassObject{ //默认调用本地的hashcode()方法根据内存地址生成hash值避免不了哈希冲突 publicnativeinthashCode(); //默认调用的equals方法比较的是'=='比较 //基本类型比较的是两者的值是否......
  • 键盘钩子(切勿用作非法用途)
    //keyboardhook.cpp:Definestheentrypointfortheconsoleapplication.//#include"stdafx.h"#include<iostream>#include<windows.h>usingnamespacestd;HHOOKg_Hook;LRESULTCALLBACKLowLevelKeyboardProc(INTnCode,WPARAMwPa......
  • 为什么重写equals方法就一定要重写hashCode方法
    在hashMap和hashTable集合中,元素是不能够重复的,所以我们在添加元素时,先要判断是否存在这个元素。而判断的方法就是先用hashCode方法判断哈希值是否相同,如果哈希值相同,再使用equals判断是否相同,如果都相同,则才证明两个元素不同。而如果哈希值不同,则不会进行后续的equals判断。哈希......
  • 与& 或| 异或^ 的三个常见用途
    与&或|异或^的三个常见用途1.与&作为掩码(bitmask)屏蔽比特串的一部片/提取比特串的一部分a=0b11010101#Binaryb=0b00000111#Bitmaskc=a&b#c=0b00000101#b作为掩码和a进行与操作后,保留了a的后三位,其余位全设为0被屏蔽了2.或|设1(set)a=0b11010101#......
  • 倾倒开关的用途及原理
    如今各种暖风机、电风扇走进了千家万户,在实际应用的时候,为了防止电器被碰到依旧工作的情况,在电风扇内部装置倾倒开关,可以避免电器带来的一些安全隐患,那么倾倒开关是如何工作的呢,倾倒开关的用途及原理,今天能点科技就带大家了解一下相关内容,希望可以给大家带来帮助。能点科技的倾倒开......
  • 为什么一个对象重写了equals必须也重写hashCode
    一言以蔽之:重写equals方法是为了比较对象的内容是否相等,重写hashCode方法是为了保证对象在哈希表等数据结构中的正确性。 1、在Java中,如果一个类重写了equals方法,则必须同时重写hashCode方法。这是因为在Java中,对象的hashCode值用于在哈希表(HashTable)等数据结......
  • Java 敞 HashCode
    HashCode算法长话短说,Java的Object.hashCode()实现算法,据get_next_hash所述,可选方案有多种,默认为5.>java-XX:+UnlockExperimentalVMOptions-XX:+PrintFlagsFin......
  • supervisor中的minfds及minprocs参数用途
    使用supervisor遇到的一个坑,为此还撕逼了一下午,先填了再说先来看看minfds及minprocs这两个参数在supervisor官方文档中的说明(官方文档地址http://www.supervisord.org/con......
  • 为什么重写equals还要重写hashcode方法
    首先需要明白什么时哈希函数:哈希函数时一个特定的算法,将任意一个类型的对象转换成一串数字(无论对象的构造多么的复杂或者多么简单),转换完的数字就是这个对象的哈希值在Object......
  • python中的venv文件夹用途和用法
    一Venv文件夹是干嘛的:在pytest中,venv文件夹通常用来存储Python的虚拟环境。虚拟环境是一种隔离Python环境的机制,可以让我们在同一台机器上运行多个Python项目,并......