HashSet如何保证数据对象不一致,附带总结hashCode和equals函数

HashSet如何保证数据对象不一致,附带总结hashCode和equals函数

基本概念

Set接口继承自Collection接口,我们都知道Set只能存储单一对象,所以重复加入相同的对象,Set只会存储一个对象,而且Set存储的对象是无序的。其保证存储的集合对象不同的方法主要来自于hashCode和equals两个函数的使用和判断。
其实现类常用为HashSet和TreeSet,这里我们主要讨论的是HashSet。

add函数

这里我们使用HashSet实现Set接口时,要实现其add方法,为了判断加入的对象是否已经在集合中存在,首先对要加入的对象与集合中对象的hashcode进行比较,如果集合中没有对象与待加入对象的hashcode一致,则将其加入集合,如果集合中存在对象与其hashcode一致,则接下来调用equals函数判断两者是否相同,若相同则删除对象,否则加入到集合中。
这里的hashcode函数和equals函数均可重写,但是不会改变其调用的顺序。

Set存储对象的hashcode函数和equals函数重写

首先确认一点java所有类对象的默认hashcode函数不是映射到其存储地址,会和其地址有关联,对地址进行hash计算,但是两个在内存中不同位置的对象其hashcode可能一致,当然这种情况出现的概率极低,所以当你想根据一个对象的字段值来判断两个两个对象是否相同时,不只是重写equals函数,还必须重写hashcode函数。例子如下:

Person类

public class Person { 
	
	private String name;
	private int age;
	
	pub
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈希表是一种常用的数据结构,它通过哈希函数将数据映射到一个固定大小的数组中。哈希表的主要特点包括: 1. 高效的查找操作:哈希表利用哈希函数将数据映射到数组的特定位置,所以可以根据键快速定位到对应的,从而实现高效的查找操作。 2. 均匀的数据分布:好的哈希函数能够将数据均匀地分布在数组中,使得每个位置上的元素数量尽可能平衡。这样可以减少冲突(多个键映射到同一个位置)的发生,提高效率。 3. 快速的插入和删除操作:由于哈希表利用哈希函数确定元素存储的位置,插入和删除操作只需要计算哈希并修改对应位置上的元素即可,时间复杂度通常为O(1)。 4. 冲突处理:由于不同的键可能映射到同一个位置上,所以哈希表需要处理冲突。常见的冲突处理方法包括开放寻址法和链地址法。 在Java中,Object类提供了hashCode()和equals()方法,这两个方法在哈希表中起到重要作用: 1. hashCode()方法:返回对象的哈希码,它是一个整数。哈希表利用hashCode()方法计算键的哈希,以确定键在数组中的位置。 2. equals()方法:用于比较两个对象是否相等。当哈希表中发生冲突时,会使用equals()方法进行键的比较,找到正确的键对。 因此,在使用HashSet时,我们需要确保存储的对象正确实现了hashCode()和equals()方法,以保证哈希表能够正确工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值