首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 集合框架高頻面試題精選(下)

     編輯:Java 相關知識

21. HashMap vs Hashtable 核心差異

維度HashMapHashtable
Null 鍵/值允許禁止
線程安全非同步同步(synchronized)
遍歷順序可配合 LinkedHashMap 保持插入/訪問序不可預測
遍歷方式Iterator(fail-fast)Enumeration(非 fail-fast)
地位主流選擇遺留類,建議用 ConcurrentHashMap

22. HashMap vs TreeMap 選型

  • 頻繁 get/put/remove、無序需求 → HashMap(O(1))。
  • 需有序遍歷鍵(自然序/定製 Comparator) → TreeMap(O(log n),紅黑樹)。
  • 大數據量先用 HashMap 存入,再轉 TreeMap 排序也是可行策略。

23. ArrayList vs Vector

相同點不同點
基於數組、索引訪問、保持插入序、迭代器 fail-fast、允許 null、隨機訪問 Vector 同步(慢);ArrayList 非同步(快),可用 Collections.synchronizedList 按需加鎖;ArrayList 更通用

並發寫入場景首選 CopyOnWriteArrayList(讀多寫少)。

24. Array vs ArrayList

  • Array:固定長度,可存基本類型與對象,多維數組語法簡潔(int[][])。
  • ArrayList:動態擴容,僅存對象(自動裝箱/拆箱有開銷),功能豐富(addAll、迭代器等)。
  • 選 Array 场景:長度確定、基本類型性能敏感、多維矩陣。

25. ArrayList vs LinkedList

操作ArrayListLinkedList
隨機訪問 get(i)O(1)O(n)
頭/尾插入刪除O(n) 需搬移/擴容O(1)
中間插入刪除O(n) 搬移O(n) 遍歷 + O(1) 改指針
內存佔用較小(連續數組)較大(節點對象 + 兩指針)

經驗法則:默認 ArrayList,只有明確高頻頭尾增刪且少隨機訪問才考慮 LinkedList。

26. 支持隨機訪問的集合

ArrayList、HashMap、TreeMap、Hashtable(實現 RandomAccess 標記接口或鍵值直接定位)。

27. EnumSet 特點

  • 專為枚舉類型設計,元素來自單一枚舉類。
  • 非同步、不允許 null、位向量實現(極快、內存極小)。
  • 工廠方法:EnumSet.of()、copyOf()、complementOf()。

28. 線程安全集合(舊 API)

Vector、Hashtable、Properties、Stack — 方法級 synchronized,吞吐低。

29. 並發集合(JUC,java.util.concurrent)

集合特點
ConcurrentHashMap分段鎖/CAS,高並發讀寫,弱一致性迭代器
CopyOnWriteArrayList寫時復制,讀無鎖,適合讀多寫少
CopyOnWriteArraySet同上,基於 CopyOnWriteArrayList
ConcurrentLinkedQueue無鎖隊列,CAS 入隊出隊

迭代器為弱一致性,不拋 ConcurrentModificationException。

30. BlockingQueue 生產者-消費者利器

  • 阻塞特性:take() 隊列空等待,put() 隊列滿等待。
  • 常用實現:ArrayBlockingQueue(有界)、LinkedBlockingQueue(可無界)、PriorityBlockingQueue(優先級)、SynchronousQueue(直接移交)。
  • 核心用於線程池任務隊列、生產消費模型。

31. 隊列 vs 棧

特性Queue (FIFO)Deque (雙端)Stack (LIFO)
接口/類Queue 接口Deque 接口Stack 類(extends Vector)
典型實現LinkedList、ArrayDequeArrayDeque、LinkedListStack

推薦:用 ArrayDeque 替代 Stack(非同步、雙端、性能更優)。

32. Collections 工具類核心能力

  • 排序:sort()、reverseOrder()
  • 查找:binarySearch()
  • 洗牌:shuffle()
  • 極值:max()、min()
  • 視圖:unmodifiableXxx()(只讀)、synchronizedXxx()(同步)、emptyXxx()(空集合)。

33-34. Comparable vs Comparator

維度ComparableComparator
位置類內部(compareTo)類外部(compare(o1,o2))
排序邏輯自然序(單一)定製序(多種可插拔)
適用場景實體類自帶默認排序第三方類、多維度排序

35. 排序 API 選擇

  • 數組:Arrays.sort()
  • 集合:Collections.sort()(內部轉數組再排)
  • Java 8+:list.sort(comparator)、stream().sorted()

36-37. 防禦性編程:只讀與同步視圖

// 只讀視圖,任何修改拋 UnsupportedOperationException
Collection<T> readOnly = Collections.unmodifiableCollection(source);

// 同步視圖,線程安全包裝
Collection<T> sync = Collections.synchronizedCollection(source);
// 注意:複合操作(如迭代)仍需手動同步鎖定 sync 對象

38. 框架內置通用算法

排序(TimSort/雙軸快排)、二分查找、洗牌(Fisher-Yates)、極值、替換、旋轉等,均在 Collections 靜態方法中。

39. 大 O 表示法與集合選型

操作ArrayListLinkedListHashMapTreeMap
get/put/removeO(1)/O(n)/O(n)O(n)/O(1)/O(1)*O(1)O(log n)
containsO(n)O(n)O(1)O(log n)

* 針對頭尾操作。選型依據:時間/空間/並發/有序性 綜合權衡。

40. 集合框架最佳實踐清單

  1. 按需選型:固定長→Array,有序唯一→LinkedHashSet,有序鍵→TreeMap,高併發→JUC。
  2. 預估容量:new ArrayList(1000)、new HashMap(1024) 避免擴容/rehash。
  3. 面向接口編程:List<String> list = new ArrayList<>()。
  4. 全程泛型:編譯期捕獲 ClassCastException。
  5. 優先用 JDK 不可變類(String、包裝類、LocalDate)作 Map 鍵,免寫 hashCode/equals。
  6. 善用 Collections 工廠方法(emptyList()、singletonMap() 等),勿重複造輪子。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved