细说java equals方法 和 ==
写法上来看
==是操作符,可以支持任何两个变量的比较,如果两边都是基本数据类型,则比较值是否相等,如果两边都是引用型,则比较地址是否相等,如果一边是包装器类型,一边是基本数据类型,则对包装器拆包,然后比较值是否相等。
equals()是一个方法,Object类中有equals(),返回的是==的结果。
为何要有equals()
既然equals方法原生返回的是==,为什么还要有equals方法呢?因为java支持继承,所有的类都继承自Object类,java也支持方法的重写,只要在方法中重写equals方法便可以自定义对象的比较方法。
那问题又来了,有人会问那我每个对象要用的时候自己写一个比较方法不好吗,这里就体现到了编程的封装性了。我面试曾问过一个写了3年java的人equals重写equals方法要注意什么,他没答上来的同时还回了一句一般代码中很少有用到equals的地方,这一下就暴露了我之前问他集合的概念的时候就仅仅是背了一些面试题而没有真正去理解。很多jdk本身提供的类中都是包含了equals方法的,因为有了equals方法,可以丰富很多原生对象的用法。
举个最简单的例子,hashmap常用吧,key不能重复知道吧,key怎么认为是重复的呢?他先排除掉hashcode特征值不相等的,再排除掉equals方法不相等的,就是key是重复的。hashmap怎么算hashcode特征值以后放到集合详解中讲,但他是基于对象的hashcode方法计算的,这里既挑明了equals方法的用处,也引申出来重写equals的注意点,就是hashcode方法也要重写,规则则是equals为true的两个实例,hashcode一定相等,但hashcode相等的两个实例,equals不一定为true(多插一句,重写hashcode不但要注意这个规则,同时还要保证尽可能的均匀分布,不要所有的实例都是一个hashcode,这个还可以和hashmap结合讲,下回分解)