關于equals()方法有疑問?
老師說equals()方法是比較對象的引用是都指向同一塊內存地址。
第一個代碼:s1和s2 不同,分別指向不同的對象內存地址
public?class?Test?A{ public?static?void?main(String?args[])?{ ????String?s1?=?new?String("Hello"); ????String?s2?=?new?String("Hello"); ???System.out.println("?s1==?s2?is?"?+?(s1?==?s2)); ???System.out.println("?s1.equals(s2)?is?"?+?s1.equals(s2)); } }
結果:
s1==?s2?is?false s1.equals(s2)?is?true
第二個代碼:由于字符串常量池的原因,s1和s2相同
public?class?Test?A{ public?static?void?main(String?args[])?{ ????String?s1?=“Hello”; ????String?s2?=?“Hello"; ???System.out.println("?s1==?s2?is?"?+?(s1?==?s2)); ???System.out.println("?s1.equals(s2)?is?"?+?s1.equals(s2)); } }
結果:
?s1==?s2?is?true ?s1.equals(s2)?is?true
根據以上兩個代碼,比較值是否相等是equals(),比較兩個引用是否指向同一內存地址是”==“。不過老師下面的代碼:
卻顯示equals()比較的就是兩個引用指向的內存地址是否相同。疑惑,難道是String和普通類創建對象有什么不同?
2015-04-12
問題解決了!
JDK類中有一些類覆蓋了oject類的equals()方法(Object?中equals()方法是比較內存地址的),比較規則為:如果兩個對象的類型一致,并且內容一致,則返回true,這些類有:java.io.file,java.util.Date,java.lang.string,包裝類(Integer,Double等)。
如果在Animal類覆蓋equals函數,就會得到不同的效果。