1/9
Looks like no tags are added yet.
Name | Mastery | Learn | Test | Matching | Spaced | Call with Kai | Chat |
|---|
No analytics yet
Send a link to your students to track their progress
Java 中 == 和 equals() 比較物件時有什麼差別?
對 reference type 而言,== 比較兩個 reference 是否指向同一個物件;equals() 用來判斷物件在邏輯上是否相等,而且 class 可以 override equals() 自訂相等的判斷方式。
為什麼兩個內容相同的自訂物件,若沒有 override equals(),呼叫 equals() 可能仍然是 false?
如果 class 沒有 override equals(),就會繼承 Object.equals() 的預設行為,判斷兩個 reference 是否指向同一個物件,因此即使兩個不同物件的欄位內容完全相同,仍可能得到 false。
hashCode() 主要有什麼用途?它和 HashMap / HashSet 有什麼關係?
hashCode() 會產生物件的 hash 值。HashMap、HashSet 等 hash-based collection 會利用 hash 值協助定位資料,縮小查找範圍,再進一步判斷物件是否相等,因此能提供高效率的查找。
如果 a.equals(b) 為 true,a.hashCode() 和 b.hashCode() 必須有什麼關係?反過來成立嗎?
如果 a.equals(b) 為 true,兩者的 hashCode() 必須相同;反過來不成立,因為不同物件可能產生相同的 hash code,這稱為 hash collision。
為什麼 override equals() 時通常也必須 override hashCode()?
因為 Java 的 contract 規定,兩個物件如果 equals() 為 true,它們的 hashCode() 必須相同。如果只 override equals() 而沒有配合 override hashCode(),可能破壞這項規則,使 HashMap、HashSet 等 hash-based collection 出現不符合預期的行為。
Java 的 String 為什麼稱為 immutable?下面最後輸出什麼?為什麼?
String s = "Java";
s.concat(" Backend");
System.out.println(s);
String 是 immutable,建立後物件本身的內容不能修改。concat() 不會修改原本的 String,而是回傳新的 String。因為題目沒有用 reference 接收回傳結果,所以 s 仍指向 "Java",最後輸出 Java。
以下結果為什麼可能是 true?
String a = "hello"; String b = "hello"; System.out.println(a == b);
String literal 會使用 String Pool,相同 literal 可以重用 Pool 中的同一個 String 物件。因此 a 和 b 都指向同一個 "hello" 物件,a == b 會得到 true。
以下兩個結果分別是什麼?為什麼?
String a = new String("hello"); String b = new String("hello"); System.out.println(a == b); System.out.println(a.equals(b));
a == b 是 false,因為 new String() 建立了不同物件;a.equals(b) 是 true,因為 String override 了 equals(),會比較字串內容。
既然某些 String literal 使用 == 可能得到 true,為什麼比較 String 內容仍應該使用 equals()?
Reference type 的 == 判斷是否指向同一物件,而內容相同的兩個 String 不一定是同一物件。因此比較 String 內容應使用 String override 過的 equals()。
為什麼大量重複拼接 String 時通常使用 StringBuilder?它和 String 最重要的差異是什麼?
String 是 immutable,反覆拼接會產生新的 String/中間結果;StringBuilder 是 mutable,可以在同一個 builder 上持續修改字元內容,因此大量字串拼接通常使用 StringBuilder,減少不必要的物件建立與配置成本。