身为一个Java初学者,经常会面临比较的情况,当使用了关系运算符或方法时,总会出现不符合自己想法的结果,但是又不清楚其中的区别。今天,我们就来讲一讲有关equals方法和==的相关知识。
==的相关知识
==是关系运算符,是用来比较的运算符,表示的表达式是boolean类型的值,符合为true,不符合为false。当然,在Java中,==关系运算符比较的对象决定了比较的方面。如果==运算两边比较的是基本数据类型,那==运算符比较的是两边变量的值,如果值相等,则是true,否则,是false。而当==运算符两边比较的是引用数据类型,则两边比较的是地址。而在程序设计中,我们很少需要比较地址是否相同,而大多数需要比较的是对象内容的相同与否。则这个运算符反而不会有太大的作用。比如:我们需要比较两个字符串的内容是否相同,使用==会出现false的结果,而不会true。如何解决这个比较的问题,需要使用equals方法,这个方法后面会有具体介绍。==运算符还可以比较具有继承关系的两个父子对象,而没有父子关系的两个对象是无法比较的。这就是==的一些基本知识。但是,由于我们对于==关系运算符较为熟悉,所以,我就不多说了。
equals的相关知识
equals方法是一个对象才可以调用的方法,也就是说,不是对象的基本数据类型变量是无法调用的。但是,在实际运用中,会发现有些时候,需要用到基本数据类型调用equals方法的现象。那就让我们来了解一下equals方法。首先,equals方法可以被任何一个类的对象调用。原因是equals方法是Object类中的一个方法。这个Object类被所有类继承。只要是Java中的类,都会隐性继承Object类。因此,只要是个类的对象都会有equals方法。但是,Object类中的equals方法不是比较引用数据类型的内容,而是比较他们的地址。那么,对于==出现的弊端,equals方法也无法解决。但是,Java的三大特性就是封装,继承和多态。其中,继承了一个类后,父类的方法无法满足子类的需要,需要重写该方法,以此来实现对应子类的需要。所以,我们需要equals方法比较的是对象的内容,那就可以通过重写equals方法来实现。到这里,有的人又发现,我使用String类型的对象的equals方法,也没有重写,就比较的内容。那是因为String类是Java系统的类。而Java系统的类大部分已经被重写了对应的equals方法,所以,不需要重写equals方法。而如果你需要使用自定义的类时,你要比较对象的内容,就必须重写equals方法。而基本数据类型需要使用equals方法,则是通过一个重要的知识点实现的。这个知识点是Java初学者必须知道的。那就是包装类。包装类就是基本数据类型转换为引用数据类型的结果。包装类就是基本数据类型面向对象化的结果。当然,基本数据类型与包装类的转换已经不需要我们来实现。在JDK1.5之后,提供了自动拆装箱的功能,可以将基本数据类型和包装类之间自动转换。
总而言之,==和Object类的equals都是比较的对象的地址。==关系符比较基本数据类型是比较的值;==关系符比较引用数据类型则是比较地址;==关系符还可以比较具有父子关系的两个对象。Object类的equals比较的是地址。Java系统提供的大部分类均已经覆盖了equals方法,即重写了equals方法,比较的是内容。而程序员自定义的类不重写则比较的是对象的地址,而重写比较的是对象的内容。一般,程序员自定义的类都需要重写equals方法。以此来满足比较内容的需要。
注意:重写equals方法一般伴随着重写hashcode方法,因为hashcode方法是和equals联合使用的。对于自定义的类是一般单凭equals方法是无法实现比较内容的功能的。需要通过hashcode方法来实现。但是,hashcode方法实现对象内容的比较,是本质是依靠了equals方法和==关系运算符实现的。