Java 集合與泛型面試題庫:從 ArrayList 到 TreeSet、從淺拷貝到類型擦除的完整解析
選擇題精選
- 遍歷 ArrayList 正確寫法:
for(int i=0;i<list.size();i++) System.out.println(list.get(i))(選 B)。
解析:Iterator 需用 hasNext() + next(),A 重複調用 next() 導致漏讀;C/D 語法錯誤。
- HashSet 去重後 size:
List→HashSet 輸出 3(選 C)。
解析:HashSet 依賴 equals/hashCode 去重,"Hello" 重複僅保留一個。
- 集合框架頂層接口:
Collection(選 B)。Map 獨立體系。
- 鍵值對存儲類:
HashMap(選 C)。
- 判斷 ArrayList 包含元素:
contains("小說")(選 C)。
- LinkedList 與 ArrayList 共同方法:
add(Object)、add(int,Object)、remove(Object)(選 ABC)。
解析:removeLast() 為 LinkedList 專有。
代碼輸出題
1. 泛型異常類編譯失敗
class MyNumberException<T> extends Exception { ... }
// 錯誤:泛型類不可直接/間接繼承 Throwable(JLS §8.1.2)
2. LinkedList 邊遍歷邊刪除
LinkedList<String> link = new LinkedList<>(Arrays.asList("F","1","2","3","L"));
for(int i=0;i<link.size();i++) link.remove(i);
// 輸出:[1, 3]
// 解析:刪除後索引前移,i 遞增導致跳過元素。
3. 引用傳遞修改元素
MyClass mc4 = (MyClass) list.get(1); // 獲取索引 1 對象引用
mc4.value = 50; // 修改對象內部狀態
// 輸出:10, 50, 30
實戰編程題
- Map 查世界杯冠軍:
map.containsKey(year) ? map.get(year) : "未舉辦"。
- List→Map 轉換並遍歷:Key 為
Account.id,Value 為對象,entrySet() 遍歷打印 id/balance。
- 學生管理系統(序列化持久化):
HashMap<String,Student> + ObjectOutputStream/InputStream 讀寫 student.txt,DAO/Service/Controller 分層。
- TreeSet 自定義比較器降序:
Comparator<Stu> 先比分數降序,分數相同按姓名升序。
- 泛型求數組最大/最小值:
<T extends Comparable<T>> 介面 + 實現類通用處理 Integer/Character 陣列。
高頻概念辨析
| 概念 | 核心差異 |
| Iterator vs ListIterator | 前者單向、後者雙向+可修改元素 |
| Collection vs Collections | 接口 vs 工具類(排序/同步/二分查找) |
| ArrayList vs Vector | 非同步/擴容 1.5倍 vs 同步/擴容 2倍 |
| HashMap vs Hashtable | 非同步/允許 null vs 同步/不允許 null |
| 淺拷貝 vs 深拷貝 | 引用共享 vs 遞歸複製對象圖 |
| transient 關鍵字 | 序列化時忽略該字段 |
| 泛型本質 | 參數化類型,編譯期類型擦除,運行期無泛型信息 |
| static 與泛型衝突 | static 屬於類、編譯期確定;泛型參數運行期確定,無法在 static 上下文使用類型參數 |