練習一、簡述String類中的equals方法與Object類中的equals方法的不同點。
答:String類中的equals方法是用來判斷兩個對象的內容是否相同,而Object 類中的equals方法是用來判斷兩個對象是否是同一個對象,所謂同一個對象指的是內存中的同一塊存儲空間。(可以重寫equals方法,比較對象的屬性)
練習二、不運行代碼,直接說出打印結果,並解釋原因。
public class ToStringTest{
static int i = 1;
public static void main(String args[]){
System.out.println("love " + new ToStringTest());//love java
ToStringTest a = new ToStringTest();
a.i++;
System.out.println("me " + a.i);//me 2
}
public String toString(){
System.out.print("I ");//I
return "java ";
}
}
運行結果:I love java me 2
(爲什麼會 先輸出 I ?)
原因:當執行代碼的時候,首先加載靜態變量,然後執行main方法,由於main方法內部第一行代碼爲輸出語句,裏面new了此類對象,當執行此行代碼時會先創建了本類的對象,由於此類重寫了toString方法,會先執行toString方法的打印輸出,然後返回“java ”,再執行main方法第一行打印輸出。在Java中“System.out.println(類對象名);”實際輸出的是該對象的toString()方法返回的字符串,即括號中的內容等價於類對象名.toString(),toString方法的好處是在碰到println方法的時候會被自動調用,不用顯示的寫出來。
練習三、Object類equals方法
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
原因:String 用引號直接賦值的 創建的對象在 方法常量池, 創建s2時 現在常量池中查找是否有 / ”abc” 所以 s1 和s2是同一個地址 。 == 判斷的是地址, .equals判斷的是值。
練習四、簡述StringBuilder類與String類的區別。
答:String類的對象內容不可改變,所以每當進行字符串拼接時,總是會在內存中創建一個新的對象,所以經常改變內容的字符串最好不要用String,因爲每次生成對象都會對系統性能產生影響。
StringBuilder又稱爲可變字符序列,是JDK5.0中新增加的一個類,它是一個類似於String的字符串緩衝區,通過某些方法調用可以改變該序列的長度和內容。即它是一個容器,容器中可以裝很多字符串,並且能夠對其中的字符串進行各種操作。它的內部擁有一個數組用來存放字符串內容,進行字符串拼接時,直接在數組中加入新內容,StringBuilder會自動維護數組的擴容。