HashCode的理解
⼀、hashcode是什么
要理解hashcode⾸先要理解hash表这个概念
1. 哈希表
hash表也称散列表(Hash table),是根据关键码值(Key value)⽽直接进⾏访问的数据结构。也就是说,它通过把关键码值映射到表中⼀个位置来访问记录,以加快查的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代⼊函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
简单理解就是:在记录的存储位置和它的关键字之间建⽴⼀个确定的对应关系f,使每个关键字和结构中⼀个唯⼀的存储位置相对应。
具有快速查和插⼊操作的优点
2. hashcode
hashcode 通过hash函数计算得到,hashcode就是在hash表中有对应的位置
每个对象都有hashcode,通过将对象的物理地址转换为⼀个整数,将整数通过hash计算就可以得到hashcode
⼆、hashcode的作⽤
HashCode的存在主要是为了查的快捷性,HashCode是⽤来在散列存储结构中确定对象的存储地址的
对于容器类设计基本上都会涉及到hashCode。在Java中也⼀样,hashCode⽅法的主要作⽤是为了配合基于散列的集合⼀起正常运⾏,这样的散列集合包括HashSet、HashMap以及HashTable。
在对集合进⾏插⼊操作时,集合内时是不允许存在重复元素的,这样就引发了⼀个问题
如何判别在集合中是否已经存在该对象了?
⾸先想到的⽅法就是调⽤equals()⽅法,这个⽅法确实可⾏。但是如果集合中已经存在⼤量的数据或者更多的数据,如果采⽤equals⽅法去逐⼀⽐较,效率必然是⼀个问题。此时hashCode⽅法的作⽤就体现出来了,当集合要添加新的对象时,先调⽤这个对象的hashCode⽅法,得到对应的hashcode值,实际上在HashMap的具体实现中会⼀个表保存已经存进去的对象的hashcode值,如果table 中没有该hash
equals()方法code值,它就可以直接存进去,不⽤再进⾏任何⽐较了;如果存在该hashcode值,就调⽤它的equals⽅法与新元素进⾏⽐较,相同的话就不存了,不相同就散列其它的地址,所以这⾥存在⼀个冲突解决的问题,这样⼀来实际调⽤equals⽅法的次数就⼤⼤降低了。
这也就解释了为什么equals()相等,则hashCode()必须相等。如果两个对象equals()相等,则它们在哈希表(如HashSet、HashMap等)中只应该出现⼀次;如果hashCode()不相等,那么它们会被散列到哈希表的不同位置,哈希表中出现了不⽌⼀次。
所以说hashCode⽅法的存在是为了减少equals⽅法的调⽤次数,从⽽提⾼程序效率。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论