首先,==是运算符而equals()是方法。==在比较基本数据类型时比较的是值,在比较对象时比较的是两个对象的物理地址。
而equals()是用来比较对象的方法,在基类Object中的源码是:
因为在基类中equals()是用==实现的,所以equals()在比较对象时比较的是两个对象的地址。但是,Java中有些类(如String类,Integer类等)对equals()进行了重写,使equals()与==在比较这些类的对象时有了区别。如在String类中,equals被重写后的源码是:
在String类中equals()先比较两个对象的物理地址,当两对象物理地址不想同时,会进一步比较两个对象所指向的内容。
举个例子
代码图:
结果:
内存分析图:
在这个例子中,代码图中的Person类没有对equals()进行重写,是继承了Object类中的equals方法。所以,在比较db1对象与db2对象时,equals方法与==一样比较的是两个对象的物理地址,即内存分析图中db1与db2后面的地址。而String类对equals方法进行了重写,所以在比较e对象与f对象时,equals方法先比较两个对象的地址,由于两对象地址不相等再进一步比较两个对象所指向的内容“abcd”字符串常量,而==只比较两对象的地址。d与b都是直接赋值字符串常量“abcd”,所以d与b的地址都是字符串常量“abcd”的地址。