本帖最后由 wkz_crystal 于 2015-3-18 19:43 编辑
其实可以这样理解:我们都知道在java中的数据类型,可分为两大类:
1:对于:基本数据类:byte,short ,int,long,……等就是最为原始的8大数据基类,它们之间在比较时,用(==),比较的是他们的值。
2:而对于:复合数据类型(类)
当他们用(==)进行比较的时候,比较的是他们在“堆内存”中存放的地址。
但是在java中,很多类都覆盖了Object基类中的equals方法(之前这个方法在Object基础类中的初始值比较的是对象的内存地址),覆盖之有了其自身的实现主体,而不再是比较类在堆内存中的存放地址了(例如String类,就是有了自己的覆盖方法)。对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
实例:
class Test
{
public static void main(String[] args)
{
String s1="abc";
String s2=new String("abc");
if(s1.equals(s2)){ //本来是应该比较对象在堆内存中地址是否相同的,
//但是被String类覆写了equals方法,比较内容去了!
System.out.println("yes");
}else
{
System.out.println("no");
}
//所以结果肯定是yes,但是你用“==”,那就是no,因为比较的是地址哈
}
}
|