hashCode与equals

如果想查找一个集合中是否包含有某个对象,通过equals方法逐一比较,若一个集合中元素很多,譬如1万个元素,这意味着可能要比较一万次。通过哈希算法则可以提高查找效率,这种方式将集合分成若干存储区域,每个对象计算出一个哈希码,将哈希码分组,每组对应某个区域。
HashSet就是采用这种存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域。java系统首先调用对象的hashCode()方法获取对象的哈希码,然后找到相应区域,最后用equels方法对区域内每个元素进行比较。
类的实例对象要被采用哈希算法进行存储和检索时,需要同时覆盖hashCode方法和equals方法(注意equals方法没有泛型)。若只hashCode方法而没覆盖equals方法:则一个类的两个实例对象哈希码不相等,则两个对象一定不相等,但两个实例对象哈希码相等,却不能说明两个对象一定相等( 导致对象没有存入集合内),这时,就要调用equals方法比较,为了尽量让不同的对象的哈希码不同,编写程序时,通常乘以一个数。若只覆盖equals方法而没有覆盖hashCode方法:两个对分别按照自己的内存地址,计算出不同的哈希值,从两个对象存储在不同的区域中,equals方法比较时,可能只在某一个区域中比较。
当一个对象被存储进HashSet集合中后,就不能修改这个对象中参与计算哈希值字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中的哈希值就不同了,这样,即使在contains 方法使用该对象的当前引作为参数去检索HastSet集合,将会找不对象,也就无法删除当前对象,从而造成 内存泄露。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值