黑马程序员技术交流社区

标题: 对象比较原理? [打印本页]

作者: 黄战胜    时间: 2011-12-28 17:15
标题: 对象比较原理?
继承了comparable接口的类,具备了比较特性,equals方法也是比较两个对象是否相等,既然两个都可以比较,比较的原理是否一样,分别一什么标准比较呢,一个对象中有一个比较性的方法不久可以了吗,为什么定义了两个呢?
作者: zl918    时间: 2012-1-7 14:19
举个反例,Map的比较方法,不但需要equals,还需要hashCode()相等。
作者: 苏格拉底的弟子    时间: 2012-1-7 20:28
楼主,你还需要对equals的含义认真琢磨下,就说我们定义了一个学生类吧,里面自然的继承了object的equals,如果不复写的话 ,比得就是他们的内存地址是不是一样,如果你想按照学生的年龄对他们排序的时候,你用这个equals 是不是觉得很无力            
所以我们就继承comparable方法!  一下是代码
public int compareTo(Object obj)
        {

                //return 0;
               
                if(!(obj instanceof Student))
                        throw new RuntimeException("不是学生对象");
                Student s = (Student)obj;

                //System.out.println(this.name+"....compareto....."+s.name);
                if(this.age>s.age)
                        return 1;
                if(this.age==s.age)
                {
                        return this.name.compareTo(s.name);
                }
                return -1;
                /**/
        }

这样写了之后,完全可以实现他们的年龄排序了,   equals却不具备这样的功能了。
作者: 常登凯    时间: 2012-1-7 21:50
这两个方法的作用差远了,equal方法时用来比较两个对象是否相等,当然默认不重写equal方法的话只是比较内存地址而已,没有意义;
而实现comparable接口的作用是为了便于将这个类的不同对象装在一个集合中时进行比较,不是比较是否,而是比较大小;比如,你定义了一个学生类,里面有姓名,年龄,班级,考试成绩这些属性;那么一个集合里如果装有很多个学生类的实例对象,那么如果说你有将这些学生排序的要求,你怎么实现?系统不会自动去帮你排序,再说他也不知道按什么属性排序啊?按年龄,按成绩,按班级?所以这时候你就需要实现comparable接口来定义这个对象在比较时根据什么属性来排序或者比较。





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