面试常问 :==与equals的关系

158 阅读1分钟

面试经常被问到这个玩意儿,刚开始就看了一下区别,但是时间一长就忘了,所以这次我准备看一下源码,深刻理解一下到底是什么原因导致。

1、==是比较内存地址的,基本数据类型在栈内存里面,所以基本数据类型是用==来比较的,但是引用数据类型不在栈内存里面,像String可能在常量池,也可能在堆里面,String一般特殊,比较String时用的是equals

2、在搞清楚这个问题之前,先要知道Object类这个玩意儿,它是所有类的父类,它里面有很多方法,所有的类都是直接或者间接的继承Object类,所以都有它的方法,Object类中有一个equals方法

源码中equals方法的底层也是用的==号,这一点说明了如果继承Object类的类没有重写equals方法的话,那么其实就是== 但是String类重写了equals方法,看一下源码

所以用String里面的equals方法比较的是内容 但是在java中hascode是用来区分两个不同对象的,因此重写了equals方法,还必须要重写hashcode方法

String里面也是这么做的。 至此,我才理解了他们的关系