我对类equals,hashcode的理解

发布时间:2014-10-25 2:20:41
来源:分享查询网

      equals(): 用来比较两个对象的内容是否相等,是Object类提供的一个方法,被所有的类所继承,其源代码是         public  boolean equals(Object obj) {             return (this == obj);         }       hashcode(): 用来获取对象的hash码,也是object类提供的方法,     hash码的引入(以下纯粹是个人理解,错漏之处请朋友们指正):      数据结构中,我们知道用来存储数据的几种常见的结构有,线性表,二叉树等,而通过线性表,二叉树寻找数据需要遍历,如果结构过大,则必会影响效率,由是提出了一种通过对象的关键码与存储地址之间的映射直接找到对象的机制,以便快速查找,这就是hash表的由来,     思路建立了,下一步就是要如何定义这个存储内容的关键字以使码与地址一一对应,由是提供了几种hash算法来取得hash码,可是由于内容的不确定性导致无论哪种算法取得的hash码都不能保证唯一性, 即:不同的内容可能得出相同的hash码, 出现这种情况就是hash冲突,于是又提出了用一些辅助的手段来消除冲突     根据以上的内容,我尝试理解下equals和hashcode的关系:     我们知道,java中的集合是用来存放对象的,在集合中,如果存放的对象很多,比如100万个,那如果采用遍历的方式取出来,效率可想而知,由是,集合(map)的设计者就想到了用hash表的方式来解决这种获取效率的问题,具体如下: 在往map中put对象的时候,先通过hashcode()方法获取key的hash码,然后把这个码和key建立对应关系,get的时候,同样获取key的hash码,通过hash码与key的映射可以直接找到key,进而取出value,当然以上只是理想的情况,因为有hash冲突,就可能导致不同的key而得到的hash码是相同的,这个时候消除这个冲突的方式就是equals()方法,即get对象时,先取key的hashcode,可能有多个,但是,只取内容和要取的key相等的键,这就保证了唯一性,定位到了键,也就定位到了値.就好比: 带有编号的猪圈里有多少猪 这个编号就是hashcode 你要比较猪是否相同 通过hashcode(及猪圈编号)直接定位到一个猪圈 再到这个猪圈来找猪 肯定效率会提高

返回顶部
查看电脑版