equals方法和hashCode方法

 对于Java语言中的老祖宗类Object有9个方法。都是作为一个对象应该具有的方法。特别是equals方法和hashCode方法最迷惑人。
1. 为什么需要equals方法?
在编程中经常需要判断一个对象和另一个对象是否相等。因此Object对象就规定了每个对象都应该有equals方法,用来判断是否和另一个对象
相等。观察Object类的源码实现:
 public boolean equals(Object obj) {
 return (this == obj);
 }
其实是在判断这两个对象是不是一个对象。对java熟悉的人都知道只有两个引用指向一个对象,那么这两个引用才会“==”。也就是这两个对
象引用指向同样的内存才会“==”。可实际中是这样的吗?两个Integer对象,值都是10,都是被new出来的。显然他们在内存中不是同一块内存,不是同一个对象。难道我们说他们不相等吗?显然不合理。
因此人们就提出来值对象和引用对象。两个概念,前者就是我们关注其值,比如钱,量,数字等。有时候我们需要根据实际情况来段两个对象
是否相当,因此我们就需要覆盖祖宗类对equals方法的默认实现。比如Student类,只要Id一样,就认为这两个对象equals.比较的时候我们就不再用"==".而用equals方法。当然你要确保你覆盖了父类的equals方法。JDK替我们实现了String和基本类型包装类的equals方法。
2. 为什么需要hashCode方法?
我们之前已经回答了祖宗类为什么需要equals方法。
在应用中我们经常需要将一些数据存起来,还能快速的查找出来。比如一个学校的学生信息。把每个学生的信息封装到一个对象中,然后用一
个容器将这些学生对象存起来(当然现实中是放在数据库中的,我只是举一个例子)。那么当我们需要某个人的信息时,希望能快速的查出来。用List存,查的时候太慢。因此jdk提供了HashSet。集合,集合的数学性质你懂的。在语言中,HashSet有个特点,就是能快速得到你要查的对象。因为他往里存的时候就采取了一定的规定。所以查的时候很快。记不记得数据结构中学的对于散列表,存储一组数,直接弄一个散列函数,根据你要存的数计算出把你放在那个地址上。那么要存储一个对象,弄一个什么样的散列函数来计算把他放到哪个地址上呢?因此HashCode方法就应运而生了。HashCode就是计算一个对象的散列值。对于Object祖宗类对于HashCode方法的实现就是这个对象的内存地址。而现实中合适吗?当然不合适,比如String类型,一模一样的字符串咱就认为他是一样的,虽然在内存中个的地址不一样,当时他们是equals的。比如“abc”在集合Set中,又弄一个“abc”对象,那么就看这个“abc”的hashcode对应的地址是否被存东西了。而Object类默认对hashcode方法的实现是内存地址。那么这两个abc的内存地址也就是hashcode肯定不一样,就认为集合中没有"abc"字符串。就把这个"abc"又放进去。此时集合就有重复的元素了。所以不同的对象有不同的hashcode方法,而不应该一棒子都认为是这个对象的内存地址。庆幸jdk对String类型和基本类型包装类都实现了其hashcode方法。比如对于String类型,是按照字符串内容计算hashcode的。所以字符串相等的两个String对象的hashcode也是一样的。基本类型包装类只要值一样,那么他们的hashcode也是一样的。但是别的类和自定义类。如果你要把他放到hashSet中一定要重写hashcode方法。
那么同样对于Map中的Key同样也有互异,无序性质。同样作为Key的东西就必须实现其HashCode方法。

http://blog.sina.com.cn/s/blog_59dbaf860100g6pz.html
http://hi.baidu.com/29163077/blog/item/39319124a310e42cc995593d.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值