equals()与hashcode()的理解

我们都知道比较两个对象是否相等,== 对于基础类型是比较值,对于封装类是比较对象的引用---即地址。Object 中equals()是比较对象的地址,String 中重写了equals()、hashcode(),equals比较的是String类的值,同理Integer、Double也都重写了equals,hashcode方法。

Set中对象是不允许重复的,那么它是通过什么方法判断元素是否重复呢,equals,那么假如Set中有1000个元素,equals1万次,那效率也太低了,它是通过hashCode()方法,jdk中hashCode是native方法,与本地机器有关,与内存地址有关。如果对象相等,那么他的hashcode必然相等。

引用网络

 

4.谈到hashcode()equals()就不能不说到hashset,hashmap,hashtable中的使用,具体是怎样呢,请看如下分析: 
Hashset是继承Set接口,Set接口又实现Collection接口,这是层次关系。那么hashset是根据什么原理来存取对象的呢? 
hashset中不允许出现重复对象,元素的位置也是不确定的。在hashset中又是怎样判定元素是否重复的呢?这就是问题的关键所在,经过一下午的查询求证终于获得了一点启示,和大家分享一下,在java的集合中,判断两个对象是否相等的规则是: 
1),判断两个对象的hashCode是否相等 
如果不相等,认为两个对象也不相等,完毕 
如果相等,转入2) 
(这一点只是为了提高存储效率而要求的,其实理论上没有也可以,但如果没有,实际使用时效率会大大降低,所以我们这里将其做为必需的。后面会重点讲到这个问题。) 
2),判断两个对象用equals运算是否相等 
如果不相等,认为两个对象也不相等 
如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键) 
为什么是两条准则,难道用第一条不行吗?不行,因为前面已经说了,hashcode()相等时,equals()方法也可能不等,所以必须用第2条准则进行限制,才能保证加入的为非重复元素。 

 

posted @ 2012-10-31 22:43  刺客XIII  阅读(1329)  评论(0编辑  收藏  举报