关于hashCode的问题

关于hashCode的问题

不管是听视频课程还是看文字教程都不太理解hashCode,没有理解清楚原理

hashCode算出地址然后分别放入数据是如何运作的 具体流程是怎样?希望能说的具体点

每个对象所运算出的hashCode值所指向的是一个地址里面有多个内容还是一块地址每个地址一个内容


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕阿园 2021-01-28 11:39:32

同学你好,同学可以结合上面同学回答的内容来理解下

问:hashCode算出地址然后分别放入数据是如何运作的 具体流程是怎样?

答:hashCode是一种规则,根据某种规则来进行存取,给同学举个例子,同学可以看下是否能理解


比如:我们有一个能存放1000个数这样大的内存中,在其中要存放1000个不一样的数字,用最笨的方法,就是存一个数字,就遍历一遍,看有没有相同得数,当存了900个数字,开始存901个数字的时候,就需要跟前900个数字进行对比,这样就很麻烦,很是消耗时间

 如果用hashcode来记录对象的位置,来看一下。hash表中有1、2、3、4、5、6、7、8个位置,存第一个数,hashcode为1,该数就放在hash表中1的位置,存到100个数字,hash表中的这8个位置会有很多数字了,1中可能有20个数字,存101个数字时,他先查hashcode值对应的位置,假设为1,那么就有20个数字和他的hashcode相同,他只需要跟这20个数字相比较(equals),如果没有一个相同,那么就放在1这个位置,这样比较的次数就少了很多


问:每个对象所运算出的hashCode值所指向的是一个地址里面有多个内容还是一块地址每个地址一个内容

答:同学是想问hashCode值所指向的是一个地址里面有多个内容,还是一个地址只有一个内容

如果是,hashCode指向的这个地址中会有多个内容

现阶段同学使用eclipse生成的hashCode方法就可以,如果同学对底层的实现比较感兴趣,可以等我们基础知识比较扎实后再来研究

祝学习愉快~


慕姐4139960 2021-01-28 01:32:44

我是这么理解:

hascode就是一种规则,可以用来区分数据 存放、读取 的规则 (这种规则 java系统有默认的 也可以自定义)


1、例如你现在有一车橙子,橙子分为 大、中、小 3中规格,不同的规则价格不一样。如果你把所有的橙子放在一起,那顾客来买大橙子,就需要从所以的橙子里面去比较,去选出符合他想要的大橙子, 那顾客得把一车橙子都筛选一遍。


2、但是如果你制定一种规则,橙子直径10-15cm的是小橙子,15-20cm的是中橙子,20-25cm的是大橙子,他们用不同的框装着,那顾客来买,只需要到对应的框里面去选就好了,不用从整车里面选。同理,你往框里放橘子的时候,也只需要根据直径 去判断放哪一个框就可以了。这种可以用来唯一标识数据的规则,我认为就是hascode。


3、例如集合中添加元素 set.add[至于哪些方法会调用hascode 这个要看方法实现的源码],会触发hascode执行某一规则,判断出这个元素符合了什么样的条件, 应该存在哪个位置,  只需要在对应的位置里面找这个元素是否存在,如果不存在就添加,如果存在就去比较更具体的内容[如equals里面的操作,如果比较的结果都相等就不添加了]



  • 像您举例的分装橙子的方法 我是明白了  主要是不理解hashCode的工作原理 所以想问问清楚
    那么 如果每个对象都有hashCode所分配的地址 我要找其中一个地址不也是需要遍历吗?

    2021-01-28 07:43:47
  • 1、不是,就是因为有了hascode才不用遍历所有,hascode的规则能够把所有传进来的值转成固定在某个范围的值。 例如你hascode定义了规则 n%3


    2、你可以用二维数组去理解存储  

    arr[][] = [

        [3,6,9,12,.....],        //这里的值都符合n%3=0

        [4,7,10,13,.....],        //这里的值都符合n%3=1

        [2,5,8,11]             //这里的值都符合n%3=2

    ]

    你现在要存14,14%3=2,那就是arr[2][] = 14;  直接追加到指定的二维数据组里面

    你现在要取15, 15%3=0,它肯定是存在arr[0][]=15,这时候你肯定要遍历arr[0][]这里面的值,其他的值arr[1][], arr[2][]就不用管理,15肯定不在那个里面


    3、如果不用hascode, 就理解成一维数组

    arr[] = [1,2,3,4,5,.....]; 

    你要存14,就是arr[] = 14;

    你要取15,就是循环arr.length次

    arr[0][] 里面的长度 肯定远小于  arr[]里面的


    4、  hashcode的原理在上面的例子理就是【n%3 这一规则】,你可以自定义

           但是如果你说的是java里面的hascode原理, 这个需要你去看源码,但是不建议现阶段去看 你可以学完所有之后感兴趣再去看

    2021-01-28 09:46:20
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师