相信很多學習過Java的同學都知道,在比較兩個String對象的內容是否相同時是使用equals方法的
如:String str1=new String(“A”);
String str2=new String(“B”);
String str3=new String(“B”);
boolean result1= str1.equals(str2);
boolean result2= str2.equals(str3);
System.out.println(result1);
System.out.println(result2);
則輸入的result1為false,result2為true。因為str1與str2的內容不相同,而str2與str3內容相同都是“B”。
而在String類中使用“==”時,比較的是兩個String對象的引用是否指向同一個對象,如
String str4=new String(“B”);
String str5=new String(“B”);
String str6=str5;
boolean result3=(str4==str5);
boolean result4= (str5==str6);
System.out.println(result3);
System.out.println(result4);
則輸入的result3為false,result4為true。因為str4、str5雖然內容相同但它們是不同的對象,就像兩個同樣的杯子裝着同樣多的水,可它們是不同的,result3為false。而str5、str6是指向同一個String對象的,所以result4為true。
再說明一點,String str = new String("abc")和String str ="abc"是有一點小區別的,對於new出來的String對象,是每new一個內存里生成一個,也就是說其允許存在內容相同的重復對象。而String str ="abc"這種形式是不允許存在內容相同的重復對象,只要內存已經存在了,就不再新生成,而是把新的引用指向原來的對象。
以上是String類equals方法和"=="的區別和聯系。下面再說說Object類的equals方法。
大家首先要明確一點Object類是所有Java類的父類,所有的Java類都要繼承Object類,所以通常我們寫程序的時候不顯式聲明繼承Object類,而是默認繼承Object類。
在Object類的equals方法的本質其實是和“==”一樣的,都是比較兩個對象引用是否指向同一個對象(即兩個對象是否為同一對象)。那為什么String類的equals方法卻又是比較兩個String對象的內容是否相同呢?
原來是這樣的,String類繼承Object類后,也繼承了equals方法,但String類對equals方法進行了重寫,改變了equals方法的比較形式。其實很多其他類繼承Object類后也對equals方法進行了重寫。
希望以上幾點對大家有用,共勉。