黑马程序员技术交流社区
标题:
HashCode方法与equals方法
[打印本页]
作者:
霍振鹏
时间:
2014-3-23 12:28
标题:
HashCode方法与equals方法
本帖最后由 霍振鹏 于 2014-3-26 14:17 编辑
谁能给我解释一下hashcode方法到底能起到什么作用,详细一点的,多谢了。
作者:
菠萝鱼
时间:
2014-3-23 13:11
hashcode是一个算法,是根据对象的内存地址计算出来的一个值,主要是用来判断是否是同一个对象,在HashSet和HashMap集合中要用到这个方法。
作者:
papercup
时间:
2014-3-23 15:37
在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果,注:这里说的equals(Object) 方法是指Object类中未被子类重写过的equals方法。
如果两个hashCode()返回的结果相等,则两个对象的equals方法不一定相等。
如果根据equals(java.lang.Object)方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
HashMap对象是根据其Key的hashCode来获取对应的Value。
在重写父类的equals方法时,也重写hashcode方法,使相等的两个对象获取的HashCode也相等,这样当此对象做Map类中的Key时,两个equals为true的对象其获取的value都是同一个,比较符合实际。
作者:
osully
时间:
2014-3-23 15:37
我记得 是为了效率
哈希值算起来快,如果哈希值都不一样,那这个肯定不重复
就没必要去equals了
作者:
织语不如书
时间:
2014-3-23 15:51
hashCode() 方法如果不复写的话就是根据两个对象的地址值计算出来的一个值【应该是比地址值短的】以判断两个对象是否同一个
如果你要复写它应该也是抱着“判断两个对象是否相同”的目的
作者:
霍振鹏
时间:
2014-3-23 16:36
我看到一句话这样说的:
equal方法被重写后
1、当obj1.equals(obj2)为true时,obj1.hashCode()==obj2.hashCode()必须为true
2、当obj1.hashCode()==obj2.hashCode()为false时,obj1.equals(obj2)必须为false
这两句话对吗?
作者:
赵军军
时间:
2014-3-24 19:34
hashcode方法用来鉴定2对象否相等
会说还有equals方法
错2方法都用来判断2对象否相等们有区别
一般来讲equals方法给用户调用想判断2对象否相等重写equals方法代码调用判断们否相等了简单来讲equals方法主要用来判断从表面上看或者从内容上看2对象相等举例子有学生类属性只有姓名和性别我们认只要姓名和性别相等说2对象相等
hashcode方法般用户会去调用比hashmap由于key重复判断key重复时候判断了hashcode方法而且也用了equals方法里重复说equals和hashcode只要有等了所简单来讲hashcode相当于对象编码好像文件md5和equals同于返回int型比较起来直观我们般覆盖equals同时也要覆盖hashcode让们逻辑致举例子还刚刚例子姓名和性别相等算2对象相等hashcode方法也要返回姓名hashcode值加上性别hashcode值样从逻辑上们致了
要从物理上判断2对象否相等用==了
作者:
刘先斌
时间:
2014-3-24 20:38
有许多人学了很长时间的Java,但一直不明白hashCode方法的作用,
我来解释一下吧。首先,想要明白hashCode的作用,你必须要先知道Java中的集合。
总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。
你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。
那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?
这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。
也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。
于是,Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。
哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。如果详细讲解哈希算法,那需要更多的文章篇幅,我在这里就不介绍了。
初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。
如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,
就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。
所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
所以,Java对于eqauls方法和hashCode方法是这样规定的:
1、如果两个对象相同,那么它们的hashCode值一定要相同;2、如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。
你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。同时,增加新元素的效率会大大下降。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2