在以前学习java的时候就没搞懂这两者的区别,但并没有去深究。但在最近打算系统学习java的时候,又遇到了这个问题,所以我到处查看资料,终于搞懂了。
一。对于基本数据类型来说,==用来判断两个数据的值,而equals不能用于基本数据类型的比较。
例如:
上面代码的运行结果:
二:1.对于大多数引用数据类型来说,==和equals来说都是比较的两个引用对象的地址。下面的例子可以说明:
上面代码的运行结果:
2.对于少部分引用类型来说(比如String,Integer,Date等),==比较的是两个引用对象的地址,equals比较的是两个对象里面的值。下面用String举例说明:
上面代码的运行结果:
结果解析:对于String类型的数据来说,在java中,程序在运行的时候会创建一个字符串缓冲池。程序运行时,首先会在这个String缓冲池中寻找相同值的对象,如果池中还没有,那么就会在池中创建一个该对象。在上面代码中,s1先被放到了池中,然后s2再去池中找到了s1所指向的同一个对象,由于是同一对象,所以==和equals返回的都是true。而s3和s4都是通过new出来的不同对象,所以他们的地址不同,而对象里面的值相同,所以==返回的是false,而equals返回的是true.由于s1指向的对象是存放在String缓冲池中,而s3是存放在堆中,所以s1和s3指向的也是两个不同的对象,故==返回的是false,equals返回的是true。
图一(大多数类中的equals方法)
究其根本原因:equals是Object类(java中所有类的父类)中的一个方法,由于Object类是所有类的父类,所以所有的类都有同一个equals方法(这个equals的底层实现其实就是==)[见图一],但少数几个类(String,Integer,Date等)对equals方法进行了重写[见图二],使得产生了不同结果。
图二(String类中的equals方法)