1. 請說明 Final, Finally, Finalize 三者不同?
- Final:
- 一種修飾關鍵字。
- 加在變數前,使變數成為常數。
- 加在方法前,使方法無法被覆寫(override)。
- 加在類別前,使類別不能被繼承(extend)。
- Finally:
- 例外處理關鍵字,Try-Catch-Finally
- 功能為保證一定執行,用意是做資源釋放。
- Finalize:
- 是Object類別的方法,故所有物件都一定有此方法。
- 當物件要銷毀前會執行的方法,此外可以透過
System.gc()
呼叫資源回收。
2. 請說明 String 字串中 == 與 .equals() 哪裡不同?
==:
- 比較儲存的值,基本型別(primitives)是儲存在 Stack 中,因此值會相同,字串是儲存在 String Pool 中,故 Stack 中存的是址。
- 使用
==
比較字串時,其實是比較他們的址。
equals():
- 是 String 覆寫後的 equals 方法,比較值。
補充:
- Java 的字串有 String Pool 機制,當宣告一個新的字串時,Java 會先去 String Pool 中尋找是否有相同的字串,有則共用,無則新增。
- 若使用
String s1 = "Hello World";
來宣告,則會透過字串池。 - 若使用
String s2 = new String("Hello World")
來宣告,則字串會存在 Heap 中,與上者的址不同。
- 若使用
- Java 的字串有 String Pool 機制,當宣告一個新的字串時,Java 會先去 String Pool 中尋找是否有相同的字串,有則共用,無則新增。
3. 使用 “abc”.equals(s) 比較好還是 s.equals(“abc”)?
- 等效。
- 前者不會出現 NullPointerException。
4. Arrays 與 ArrayList 的差異?
- Arrays 可包含原始(primitive)及物件(object),ArrayList只允許物件。
- Arrays 大小固定,ArrayList 可動態調整。
- ArrayList 提供許多方法,如 removeAll、iterator等。
5. stack 與 heap 的區別?
- stack: 可被預測生命週期的變數或函數資訊都放在 stack,例如:區域變數(local variable)、物件或陣列的返回位址(function/method return address)等資訊。
- heap: 動態配置的記憶體空間,放置被 new 出來的物件以及內含的成員變數。
6. Arrays 與 String 的大小
- Arrays 有 length 這個屬性。
- String 有 legnth() 這個方法。
7. throw 與 throws 的區別
- throws: throws 關鍵字通常被應用在聲明方法時,放在方法的大括號前,用來拋出異常,多個異常可以使用逗號隔開。後續使用者要調用方法時必須要拋出異常或者使用 try-catch 語句處理異常。
- throw: throw 關鍵字通常用在設計方法時,預先宣告可能會產生的例外,後續方法使用者需要使用 try-catch 處理例外,或者使用 throws 關鍵字再拋出例外。
- 補充:
- throw 用於方法內,throws 用於方法的聲明。
- throw 用於方法內拋出異常,throws 用於方法聲明上拋出異常。
- throw 後面只能有一個異常,throws 可以聲明多個異常。
8. int 和 Integer 何者會占用更多記憶體?
- Integer,Integer 是一個物件,會在 heap 中儲存,並儲存址的值到 stack 中,而 int 只會保存值在 stack 中。
9. 是否能將 int 強制轉型為 byte?
- 可以,可以使用
b = (byte) a
來進行強制轉換,但是超過範圍的部分會被丟棄。
10. 是否能保證 gc 的執行?
- 否,垃報回收機制程式設計師無法保證,但可以透過
System.gc()
呼叫。
11. abstract class 與 interface 的區別?
- abstract class 可以宣告抽象方法,提供子類別實作。
- interface 的方法必定是抽象方法。
- 一個類別可以繼承多個介面,但只能繼承一個抽象類別。
12. List 與 Set 區別?
- List:
- 有順序性(索引值)。
- 可重複。
- ArrayList 實作了 List 介面。
- ArrayList: 插入、刪除速度 \(O(n)\),走訪速度\(O(1)\)。
- LinkedList: 插入、刪除速度 \O(1)\),走訪速度\(O(n)\)。
- Set
- 無順序性(配合 iterator)
- 不可重複,走訪速度\(O(1)\)。
- HashSet 實作了 Set 介面。
- HashSet: 無順序性,查找速度快。
- LinkedHashSet: 有順序性
- TreeSet: 有排序性(依字母)
- Map 1.有元素鍵值(Key-Value),搜尋快 2.元素可重複,鍵值如果重複新加入值會覆蓋舊有值 3.HashMap: 查找速度慢,插入刪除速度快 4.TreeMap: 有排序性