我们需要知道所有类默认继承自Object。那么Object类中的方法也就耐人寻味。
其中尤以Hashcode和equals方法为明星方法。
我们的IDE在提供默认的get和set方法的地方总会有提供hashcode和equals方法的按钮。这就说明这两个方法很重要,和get,set一样重要。
我们还需要知道==和equals()。
我们要知道Java里面的操作符==
其实是比较的是地址值
。不管你怎么理解地址这个东西在Java中,反正就是地址。
我们还需要知道Object中的equals()。所有类,都继承自Object,都有Object的equals的这个方法。
所以这个方法讲了啥?
Object类的equals方法的作用等于==。
接下来是三种情况:
1.我写的Student没重写equals,那么比较stu1,stu2,比较的就是内存,就是栈所指向的那块区域的地址是否相等。
2.我写的Student重写了equals方法,通过看重写的源码,发现比较的其实是两个对象的所有成员变量是否相等。如果相等就是同1个对象。这种方法比较低效,所以需要重写hashcode()函数,先算hash,如果不等,绝不可能是1个对象,如果相等,再比较equals,如果还相等,就是一个对象,如果不等,那么还不是一个对象。(因为Java中的hash是弱hash,因此这么麻烦。)。那为什么不直接用Object类中的hashcode()呢?为了降低hash算法的碰撞率。
3.String类默认重写了equals方法,所以凡是涉及string比较equals的方法都蠢的一批,就是比较两个字符串是否相等。不管他是字符串常量,字符串变量,对象,拼接的常量,拼接的变量,总之就是一句话,比较俩串是否相等。如果相等,则返回true,否则返回false。
对照我们在JavaEE中常写的POJO,我们发现,POJO只是1个类,一个模板,然后依照这个类,比葫芦滑瓢创建的对象存在于堆当中的才是我们需要关心和思考的东西。原来是存在数据库中,然后让我们取到内存中了,或者是用户从前台把数据给我们了,这个时候,需要重写么?
pojo类绝对要重写的。最简单的,登陆系统。从数据库中查到用户返回到controller,然后和前台进行equals比较,如果equals则证明用户存在。
我们写的工具类需要重写么?不需要。工具类又不需要比较对象,甚至他们都是静态的。
那干活的类呢?比如servlet。
这些类都是class,都是jar,也写不了啊。更何况也不需要重写。
只有某个类涉及到equals时。而equals又反映的是一种比较,数据的比较,查询。那还是pojo啊。
自己设计的工厂类呢?这个就看需求吧。