1.网上很多说法都是:==是比较内容是否一样,equals是比较是否是同一个对象。这种说法是错误的。
注意:有一些同伴在测试这个问题的时候会用String类型的变量进行测试,这时候必须记住两个要点:
1.String类型对equals方法进行了重写,比较的是内容是否相等。
2.String类型是final类型:
String str1 = "abc"; String str2 = "abc"; str1和str2指向的是同一个对象。
String str3 = new String("abc"); String str4 = new String("abc"); str3和str4指向的是两个不同的对象。
2.所以,正确的是:
对于==来说,并不是绝对的只比较内容是否相等。有两种情况:如果是比较java的基本数据类型,则==比较的是内容是否相等;
如果比较的是引用类型,则比较的是是否是同一个对象。
对于equals来说,equals不允许拿来比较基本数据类型,只能比较引用类型,比较是否是同一个对象,除非重写了equals方法。
但是,有一些类型是对equals方法进行了重写的,比较的是内容是否相等。例如String,Date等类型对equals方法进行了重写。
*********************************************
验证:
输出结果:
解释:
编号1:String类重写了equals方法,比较的是内容,所以输出是true.
编号2:String是引用类型,==在这里比较的是指向的是是否是同一个对象,输出为true。所以证明str1和str2是同一个对象,为什么呢?
在开头说了,String是final类型,是不可变对象,如果不是通过new方法来新建对象,如果两个字符串的内容是相同的,那么第二次新建字符串
的时候,不会再重新新建一个字符串,而是引用同一个字符串。因为str2的内容和str1的内容是相同的,所以str2指向的str1的字符串,而不是新建一个字符 串。
编号3:String类重写了equals方法,比较的是内容,所以输出是true.
编号4:String是引用类型,==在这里比较的是指向的是是否是同一个对象。str4是通过new新建的对象,所以str3和str4指向的是不同的对象,输出false。
编号5:str3和str4都是通过new新建的对象,所以是不同的对象,输出false。
编号6:String类重写了equals方法,比较的是内容,所以输出是true.