首先我们应明确几个问题

1.变量与对象是2个不同的概念

Object a =new Object();

以上代码中a就是变量,在内存中实际存在的数据就是对象

2.所有引用类型的变量值都是引用地址

假设某对象在内存中的地址是0*6528,则变量的值就是0*6528

harbor获取schedule时出现错误 获取hashcode啥意思_java

什么是hashCode

  • 通常,口头描述中的hashCode指的是hashCode()方法,或该方法的返回值
  • hashCode()方法是由Object类定义的,所以,在java中,所有的类都有该方法,并且,所有的类都可以重写该方法

hashCode()描述:

  • 翻译:


常见的误区:

误区:hashCode就是对象的内存地址

反向论证:hashCode无法表示对象的内存地址

harbor获取schedule时出现错误 获取hashcode啥意思_开发语言_02

解读:哈希(hash)一般指散列算法,也称之为哈希算法,在Object类的实现中,哈希码(hashCode)是通过哈希算法得到的一个整型结果,本质上与内存 地址没有关系

误区产生的原因:根据Object的hashCode()实现,每个对象的hashCode 值(理论上)都不同,通常可以用与判断2个变量是否引用同1个对象


误区:手动使用hashCode

解读:如同Java SE文档中指出:“This method is supported for the benefit of hash table such as those provided by HashMao”,即:这个方法是为哈希表提供支持的没比如HashMap提供的哈希表

通俗说,hashCode的设计是提供给JVM管理对象时使用的,并不是让开发者自行使用的

 

hashCode的作用:


1.Hash容器可以通过hashCode定位需要使用的对象

典型的Hash容器:HashSet HashMap  HashTable ConcurrentHashNap

再次强调:hashCode 不是对象的内存地址,只是通过它去找而已


2.Hash容器通过hash来排除2个不相同的对象

列如:

向HashSet的元素.HashMap的Key等都要求“唯一”,如果即将添加的元素的hashCode与集合中的已有的每个元素的hashCode均不同,则可以视为 “当前集合中上不存在即将添加的元素”

如果2个对象的hashCode 相同Hash容器还会调用equals()方法,仅当equals()也返回true时,才会是为“”相同 “


总结:

      hashCOde()是Objec定义的方法,它将返回一个整型值,他并不代表对象在内存中的地址,他存在的价值是为Hash容器处理数据时提供支持,Hash容器可以跟据hashCode定位需要使用的对象,也可以根据hashCode来排除2个不相同的对象,即:hashCode不同,则视为2个对象不同

      在重写hashCode ()时,应该遵循Java SE的官方指导:

如果2个对象使用equals()对比的结果为true,则2个对象的hashCode()返回的结果应该相同,如果2个对象使用equals()对比的结果为false,则2个对象的hashCode()返回的结果应该不相同通常我们不必关心如何重写equals()方法和hashCode()方法,而是使用IDE生成,列如:Eclipse Inte;;ij Idea,他们的生成方法是符合以上指导意见的