equals与hashcode的关系

1、hashcode方法和equals方法都是Object类中的方法,Object类对equals方法进行了定义,比较的是两个对象的引用来确定比较的对象是否是同一个对象;

而Object类没有对hashcode方法进行定义。

2、当对象类需要进行比较或者插入到集合中时,需要重写equals方法和hashcode方法,同时要保持两个方法返回结果一致

3、equals方法一般用于对象实例内容的比较,而hashcode方法一般用于集合中用到;

集合使用步骤:

(1)对象放入到 集合中时,首先需要比较放入对象的hashcode值是否与原有集合中的元素重复(hashcode方法),如果不相等就直接放入到集合中;

(2)如果hashcode值相等,则再次比较equals方法,如果该方法返回值不一致就可以插入到集合中,但如果也相等,则不能插入到集合中

注:一般hashcode方法主要用在使用hash结构的类中,比如HashSet、HashTable、HashMap中等;在hash结构中还存在同一个hash值对应的桶的结构(实际上是一个数组),如果hash值相同,然后equals方法不同,则会放入到同一个位置的桶结构中。

具体代码:

测试代码:(没有重写equals方法)

LinkedList<Person> list = new LinkedList<>(); // 链表有序集合(可以插入重复内容)
Set<Person> set = new HashSet<>();

Person p1 = new Person();
Person p2 = new Person();

p1.setAge(12);
p1.setName("p");

p2.setAge(12);
p2.setName("p");

System.out.println("p1 == p2:" + (p1 == p2));// == 比较的是其值是否相同
System.out.println("p1 equals p2" + (p1.equals(p2)));// 调用Object的equals,判断是否是同一个对象

list.add(p1);
list.add(p2);

set.add(p2);
set.add(p1);
System.out.println(list.size());
System.out.println(set.size());

结果:

p1 == p2:false
p1 equals p2false
2
2

代码测试:(重写equals方法)

p1 == p2:false
p1 equals p2false
2
2

代码测试:(重写hashcode方法)

p1 == p2:false
p1 equals p2 :true
2
2

代码测试:(两个都重写)

p1 == p2:false
p1 equals p2 :true
2
1

另外,说到hashcode方法了,就再说一下HashSet集合和HashMap集合的渊源:

HashSet集合在底层也是使用HashMap来实现元素的保存,只是将元素本身作为key,而value是一个Object对象(未知);而HashMap集合在底层是通过一个泛型动态数组来保存数据的:transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

这个泛型动态数组初始化大小是16,,负载因子是0.75,当插入的元素个数达到数组大小*0.75时

泛型数组每次增长都是变为原来的二倍;(利用空间换时间来提高读取速度)

同时泛型动态数组中又包含桶的结构,类似于c中的链表数组,桶中保存的都是hash值相同的元素;

如图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值