黑马程序员技术交流社区

标题: 关于重写equals( ),hashcode( )以及compareTo( )方法 [打印本页]

作者: 曾_强    时间: 2012-5-12 18:36
标题: 关于重写equals( ),hashcode( )以及compareTo( )方法

  在写代码过程中突然有个疑问,具体什么时候重写equals( ) , hashcode( )以及compareTo( )方法?以及重写的目的?

比如:String,Math,Integer 等封装类重写了Object中的equals( )方法,让它不再比较对象的引用,而是比较对象中实际包含的内容。

  自己思考了几天,请兄弟们提携。

  








作者: 陈忠    时间: 2012-5-12 19:05
equals()方法和hashcode()方法都是Object类中的方法。
而在object类中,equals方法的内部实现其实也是在比较两个对象的地址的值是否相同。
在String,Math,Integer 等封装类中都重新复写了这连个方法。
就拿String类来说,调用其对象的equals方法,实际上是比较两个对象的内容是否相等,而不再是比较地址值了。
所以当我们需要比较两个对象的具体内容是否相等时,就需要复写equals方法。
一般来说,如果你要把一个类的对象放入容器中,那么通常要为其重写equals()方法,让他们比较内容而不比较地址。特别地,如果要把你的类的对象放入散列中,那么还要重写hashCode()方法
复写hashcode方法,其实就是定义一个自己的算法,算出哈希值,返回自己的哈希值。

compareTo()是comparable接口中的方法
举例来说:如果你定义了一个Person类,想把这个类的多个对象放入一个有序的集合时(比如放入TreeSet集合中)。本身Person类是不具备比较性的。
所以实现comparTo方法,实际是让对象就有可比较性。

这里说了个大概,希望能对你有帮助。其实网上有很多类似问题的相关帖子。有些的比较具体的,你可以去看看!
作者: 张成龙    时间: 2012-5-12 19:09
在hashset集合中:如果元素的HashCode值相同,才会判断equals是否为true。 如果元素的hashcode值不同,不会调用equals。
在判断元素存在及增删操作时,依赖的方法是元素的hashcode和equals方法。要保证元素唯一就需要重写equals( ),hashcode( )。
TreeSet
排序时让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法(元素的自然顺序)。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性,定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
定义一个类,实现Comparator接口,覆盖compare方法。

作者: 付左军    时间: 2012-5-12 20:40
自定义参数作为排序条件时

作者: 黑马-王建雨    时间: 2012-5-12 20:43
1)当向集合中存入一个元素时,会调用该元素的hashCode方法,得到该对象哈希值,如果集合中已有元素的哈希值和该元素的哈希值不重复,该元素被存入集合。
2)如果要存入元素的哈希值和已有元素的哈希值相同,会进一步调用equals方法,比较这两个元素是否相同,如果不同,该元素依然会被存入集合,如果相同,则认为这两个元素相同,由于集HashSet集合中不能存入相同元素,所以存储动作不会成功。
需要说明的是:覆写这两个方法并非必须。如果只是编写一个用于测试的简单类,完全没有必要一定覆写这两个方法。只是一般开发中考虑到程序的扩展性,或者该类对象有可能被存储到HashSet中,覆写这两个方法可以为以后程序的升级提供方便。当然,一个好的类,一般会覆写Object中的equals方法、hashCode方法、toString方法等。
compareTo()是接口中的方法。当你需要使集合自身具有比较性时,需要自定义比较器,实现comparable方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2