前言
最近老婆大人在学习编程,what?一个金融专业的都来学编程了!!!看来程序猿们的内卷不只来自于同行, 其他行业也开始对咱们施压了。问我的一些Java的基础知识,有些我竟然答不上来,所以最近准备再撸一遍基础知识。
equals和==的区别
对于基本数据类型(byte,short,char,int,long,float,double,boolean), ==比较的是值相等
对于引用类型,在没有覆写equals方法的情况下,==比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
But, JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
equals方法和hashcode的关系?
同为Object类中的方法
public boolean equals(Object obj)
public native int hashCode()
需要注意以下三点:
1、两个对象equals不相等,那么两对象的hashCode()返回必定不同(此处可用来提高哈希表性能)
2、两个对象的hashCode()返回值相同,两对象不一定相同,还需要通过equals()再次判断
3、当equals方法被重写时,通常有必要重写 hashCode 方法
hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置,当对象不会用来创建像hashMap、hashSet等散列表时,hashCode()实际上用不上。
重写equals方法后重写hashCode方法的必要性
Set区别对象是不是唯一的标准是,两个对象hashcode是不是一样,再判定两个对象是否equals;
Map 是先根据Key值的hashcode分配和获取对象保存数组下标的,然后再根据equals区分唯一值(详见下面的map分析)
如果两个对象互相equals,那么这两个对象的hashcode值必须相等;
举个例子,比如:有个A类重写了equals方法,但是没有重写hashCode方法,看输出结果,对象a1和对象a2使用equals方法相等,按照上面的hashcode的用法,那么他们两个的hashcode肯定相等,但是这里由于没重写hashcode方法,他们两个hashcode并不一样,所以,我们在重写了equals方法后,尽量也重写了hashcode方法,通过一定的算法,使他们在equals相等时,也会有相同的hashcode值。
参考:
https://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html
https://www.oschina.net/question/82993_75533
https://zhuanlan.zhihu.com/p/30321358