Java Map實現類面試題

Java Map實現類面試題

HashMap

Q1: HashMap的實現原理是什么?

HashMap基于哈希表實現,使用數組+鏈表+紅黑樹(Java 8)的數據結構。

public class HashMapPrincipleExample {// 模擬HashMap的基本結構public class SimpleHashMap<K, V> {private static final int DEFAULT_CAPACITY = 16;private static final float LOAD_FACTOR = 0.75f;private Entry<K, V>[] table;private int size;private static class Entry<K, V> {K key;V value;Entry<K, V> next;Entry(K key, V value, Entry<K, V> next) {this.key = key;this.value = value;this.next = next;}}@SuppressWarnings("unchecked")public SimpleHashMap() {table = new Entry[DEFAULT_CAPACITY];}public V put(K key, V value) {int hash = hash(key);int index = indexFor(hash, table.length);// 遍歷鏈表for (Entry<K, V> e = table[index]; e != null; e = e.next) {if (e.key.equals(key)) {V oldValue = e.value;e.value = value;return oldValue;}}// 添加新節點addEntry(hash, key, value, index);return null;}private void addEntry(int hash, K key, V value, int index) {Entry<K, V> e = table[index];table[index] = new Entry<>(key, value, e);if (++size > table.length * LOAD_FACTOR) {resize(2 * table.length);}}private int hash(K key) {return key == null ? 0 : key.hashCode();}private int indexFor(int hash, int length) {return hash & (length - 1);}}
}

Q2: HashMap的擴容機制是怎樣的?

public class HashMapResizeExample {public void demonstrateResize() {HashMap<String, Integer> map = new HashMap<>();// 1. 默認初始容量16,負載因子0.75System.out.println("初始容量:" + 16);System.out.println("擴容閾值:" + (16 * 0.75));// 2. 指定初始容量HashMap<String, Integer> customMap = new HashMap<>(32);// 3. 模擬擴容過程for (int i = 0; i < 13; i++) {map.put("key" + i, i);System.out.println("當前大小:" + map.size());}}// 擴容時的數據遷移public void demonstrateRehash() {HashMap<String, Integer> map = new HashMap<>(4);map.put("A", 1); // index = hash("A") & (4-1)map.put("B", 2);map.put("C", 3);// 擴容后 index = hash("A") & (8-1)}
}

TreeMap

Q3: TreeMap的實現原理是什么?

TreeMap基于紅黑樹實現,可以保證鍵的有序性。

public class TreeMapPrincipleExample {// 1. 自然排序public void naturalOrdering() {TreeMap<String, Integer> map = new TreeMap<>();map.put("C", 3);map.put("A", 1);map.put("B", 2);// 按鍵的自然順序排序for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}}// 2. 自定義排序public void customOrdering() {TreeMap<Person, String> map = new TreeMap<>((p1, p2) -> {int ageCompare = Integer.compare(p1.getAge(), p2.getAge());if (ageCompare != 0) return ageCompare;return p1.getName().compareTo(p2.getName());});map.put(new Person("Tom", 20), "Student");map.put(new Person("Jerry", 18), "Student");map.put(new Person("Bob", 20), "Teacher");}// 3. 范圍操作public void rangeOperations() {TreeMap<Integer, String> map = new TreeMap<>();for (int i = 1; i <= 10; i++) {map.put(i, "Value" + i);}// 獲取子MapMap<Integer, String> subMap = map.subMap(3, 7);// 獲取小于等于key的EntryMap.Entry<Integer, String> floorEntry = map.floorEntry(5);// 獲取大于等于key的EntryMap.Entry<Integer, String> ceilingEntry = map.ceilingEntry(5);}
}

LinkedHashMap

Q4: LinkedHashMap的特點是什么?

LinkedHashMap在HashMap的基礎上維護了一個雙向鏈表,可以保持插入順序或訪問順序。

public class LinkedHashMapExample {// 1. 插入順序public void insertionOrder() {LinkedHashMap<String, Integer> map = new LinkedHashMap<>();map.put("A", 1);map.put("B", 2);map.put("C", 3);// 遍歷時保持插入順序}// 2. 訪問順序public void accessOrder() {LinkedHashMap<String, Integer> map = new LinkedHashMap<>(16, 0.75f, true);  // accessOrder = truemap.put("A", 1);map.put("B", 2);map.put("C", 3);map.get("A");  // 訪問A,A會移到鏈表末尾// 遍歷時A會在最后}// 3. LRU緩存實現public class LRUCache<K, V> extends LinkedHashMap<K, V> {private final int capacity;public LRUCache(int capacity) {super(capacity, 0.75f, true);this.capacity = capacity;}@Overrideprotected boolean removeEldestEntry(Map.Entry<K, V> eldest) {return size() > capacity;}}
}

ConcurrentHashMap

Q5: ConcurrentHashMap的實現原理是什么?

ConcurrentHashMap在Java 8中使用CAS和synchronized來保證并發安全。

public class ConcurrentHashMapExample {// 1. 基本使用public void basicUsage() {ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();map.put("A", 1);map.putIfAbsent("B", 2);map.computeIfAbsent("C", key -> 3);}// 2. 原子操作public void atomicOperations() {ConcurrentHashMap<String, AtomicInteger> map = new ConcurrentHashMap<>();map.putIfAbsent("counter", new AtomicInteger(0));// 線程安全的計數器map.get("counter").incrementAndGet();}// 3. 并發迭代public void concurrentIteration() {ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();// 填充數據for (int i = 0; i < 100; i++) {map.put("key" + i, i);}// 并發遍歷map.forEach(8, (key, value) -> System.out.println(key + ": " + value));}
}

Q6: 如何選擇合適的Map實現類?

public class MapSelectionExample {public void demonstrateUsage() {// 1. 一般用途,非線程安全Map<String, Object> hashMap = new HashMap<>();// 2. 需要有序Map<String, Object> treeMap = new TreeMap<>();// 3. 需要記住插入順序Map<String, Object> linkedHashMap = new LinkedHashMap<>();// 4. 需要線程安全Map<String, Object> concurrentMap = new ConcurrentHashMap<>();// 5. 需要同步Map<String, Object> synchronizedMap = Collections.synchronizedMap(new HashMap<>());// 6. 實現LRU緩存Map<String, Object> lruCache = new LinkedHashMap<>(16, 0.75f, true) {@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {return size() > 100; // 限制大小為100}};}// 使用場景示例public void usageScenarios() {// 1. 頻繁插入刪除HashMap<String, Object> hashMap = new HashMap<>();// 2. 需要排序TreeMap<String, Object> treeMap = new TreeMap<>();// 3. 需要保持插入順序LinkedHashMap<String, Object> linkedHashMap = new LinkedHashMap<>();// 4. 高并發場景ConcurrentHashMap<String, Object> concurrentMap = new ConcurrentHashMap<>();}
}

面試關鍵點

  1. 理解HashMap的底層實現
  2. 掌握HashMap的擴容機制
  3. 了解TreeMap的排序原理
  4. 熟悉LinkedHashMap的特點
  5. 理解ConcurrentHashMap的并發機制
  6. 掌握Map的選擇原則
  7. 注意線程安全問題
  8. 理解性能和內存消耗

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896272.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896272.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896272.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Win32/ C++ 簡易對話框封裝框架(多語言, 通知欄菜單, 拖拽文件處理)

Win32 簡易對話框封裝簡易框架示例 1. 菜單操作: 多語言 2. 通知欄圖標菜單 3. 其他操作: 接受拖拽文件等等 CDialogFrame.h #pragma once #include "CWindow/CDialogBase.h" #include "CNSFHeader.h" #include "Win32Utils/CBytesUtils.h" …

如何在WordPress網站中查看移動版本—快速預覽與自定義設置

在WordPress網站的構建過程中&#xff0c;確保網站在移動端的顯示效果至關重要。畢竟&#xff0c;隨著越來越多的用戶通過手機訪問互聯網&#xff0c;一個優化良好的移動版網站將直接影響用戶的留存率和訪問體驗。 如果你是WordPress網站的所有者&#xff0c;本文將向你介紹如…

課程1. 深度學習簡介

課程1. 深度學習簡介 神經網絡結構邏輯回歸XOR問題&#xff08;異或問題&#xff09; 中間特征的生成全連接神經網絡中間網絡層的激活函數Sigmoid函數Tanh函數ReLU函數其它激活函數 使用全連接神經網絡解決 XOR 問題神經網絡用于回歸問題訓練神經網絡 不同類型的神經網絡 附加材…

Vue.js Vue 測試工具:Vue Test Utils 與 Jest

Vue.js Vue 測試工具&#xff1a;Vue Test Utils 與 Jest 在 Vue.js 的開發過程中&#xff0c;編寫和執行測試是確保應用質量和穩定性的關鍵步驟。Vue Test Utils 和 Jest 是 Vue.js 官方推薦的測試工具&#xff0c;二者結合使用&#xff0c;可以高效地進行單元測試和集成測試…

數據結構 1-2 線性表的鏈式存儲-鏈表

1 原理 順序表的缺點&#xff1a; 插入和刪除移動大量元素數組的大小不好控制占用一大段連續的存儲空間&#xff0c;造成很多碎片 鏈表規避了上述順序表缺點 邏輯上相鄰的兩個元素在物理位置上不相鄰 頭結點 L&#xff1a;頭指針 頭指針&#xff1a;鏈表中第一個結點的存儲…

各種以太坊Rollup技術

以太坊Rollup技術是一種通過將大量交易批處理并在主鏈上記錄較小的數據摘要來擴展以太坊網絡的方法。Rollup技術主要分為兩種類型&#xff1a;樂觀Rollup&#xff08;Optimistic Rollup&#xff09;和零知識Rollup&#xff08;ZK-Rollup&#xff09;。下面詳細介紹這兩種技術及…

Kubernetes開發環境minikube | 開發部署MySQL單節點應用

minikube是一個主要用于開發與測試Kubernetes應用的運行環境 本文主要描述在minikube運行環境中部署MySQL單節點應用 minikube start --force kubectl get nodes 如上所示&#xff0c;啟動minikube單節點運行環境 minikube ssh docker pull 如上所示&#xff0c;從MySQL官…

DeepSeek 助力 Vue 開發:打造絲滑的二維碼生成(QR Code)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

一文詳解U盤啟動UEFI/Legacy方式以及GPT/MBR關系

對于裝系統的老手而說一直想研究一下裝系統的原理&#xff0c;以及面對一些問題時的解決思路&#xff0c;故對以前的方法進行原理上的解釋&#xff0c;主要想理解其底層原理。 引導模式 MBR分區可以同時支持UEFI和Legacy引導&#xff0c;我們可以看一下微pe制作的啟動盤&#…

回合制游戲文字版(升級)

//在上一篇博客的基礎上&#xff0c;加了細節的改動 //改動&#xff1a;添加了外貌&#xff0c;性別&#xff0c;招式的細節描繪&#xff1b;添加了個人信息展示界面 //一創建java文件1&#xff0c;命名為playGame package test2;import java.util.Random;public class play…

halcon三維點云數據處理(二十五)moments_object_model_3d

目錄 一、moments_object_model_3d例程二、moments_object_model_3d函數三、效果圖一、moments_object_model_3d例程 這個例子說明了如何使用moments_object_model_3d運算符來將3D數據與x、y、z坐標軸對齊。在實際應用中,通過3D傳感器獲取的物體模型可能具有一個與物體主軸不…

一周學會Flask3 Python Web開發-flask3上下文全局變量session,g和current_app

鋒哥原創的Flask3 Python Web開發 Flask3視頻教程&#xff1a; 2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili flask3提供了session,g和current_app上下文全局變量來方便我們操作訪問數據。 以下是一個表格&#xff0c;用于比較Flask中的…

antv G6繪制流程圖

效果圖&#xff08;優點&#xff1a;可以自定義每一條折線的顏色&#xff0c;可以自定義節點的顏色&#xff0c;以及折線的計算樣式等&#xff09;&#xff1a; 代碼&#xff1a; <!-- 流程圖組件 --> <template><div id"container"></div>…

DeepSeek-R1本地部署保姆級教程

一、DeepSeek-R1本地部署配置要求 &#xff08;一&#xff09;輕量級模型 ▌DeepSeek-R1-1.5B 內存容量&#xff1a;≥8GB 顯卡需求&#xff1a;支持CPU推理&#xff08;無需獨立GPU&#xff09; 適用場景&#xff1a;本地環境驗證測試/Ollama集成調試 &#xff08;二&a…

2025-spring boot 之多數據源管理

1、是使用Spring提供的AbstractRoutingDataSource抽象類 注入多個數據源。 創建 DataSourceConfig 配置類 通過spring jdbc 提供的帶路由的抽象數據源 AbstractRoutingDataSource import org.springframework.beans.factory.annotation.Autowired; import org.springframew…

keycloak - 開發環境的配置持久化

keycloak - 開發環境的配置持久化 前情提要&#xff1a; Keycloak - docker 運行 & 前端集成 本來是想順便試一下 Okta 集成的&#xff0c;但是發現 Okta 沒有本地的 docker 鏡像&#xff0c;他們畢竟是做 Identity as a service……算了…… 更新后的 docker compose 如…

項目實戰--網頁五子棋(匹配模塊)(4)

上期我們完成了游戲大廳的前端部分內容&#xff0c;今天我們實現后端部分內容 1. 維護在線用戶 在用戶登錄成功后&#xff0c;我們可以維護好用戶的websocket會話&#xff0c;把用戶表示為在線狀態&#xff0c;方便獲取到用戶的websocket會話 package org.ting.j20250110_g…

第4章 4.4 EF Core數據庫遷移 Add-Migration UpDate-Database

4.4.1 數據庫遷移原理 總結一下就是&#xff1a; 1. 數據庫遷移命令的執行&#xff0c;其實就是生成在數據庫執行的腳本代碼&#xff08;兩個文件&#xff1a;數字_遷移名.cs 數字_遷移名.Designer.cs&#xff09;&#xff0c;用于對數據庫進行定義和修飾。 2. 數據庫遷移…

Spring Boot + JSqlParser:全面解析數據隔離最佳實踐

Spring Boot JSqlParser&#xff1a;全面解析數據隔離最佳實踐 在構建多租戶系統或需要進行數據權限控制的應用時&#xff0c;數據隔離是一個至關重要的課題。不同租戶之間的數據隔離不僅能夠確保數據的安全性&#xff0c;還能提高系統的靈活性和可維護性。隨著業務的擴展和需…

51單片機編程學習筆記——點亮LED

大綱 器件51單片機開發板總結 安裝驅動點亮LED燒錄 隨著最近機器人爆火&#xff0c;之前寫的ROS2系列博客《Robot Operating System》也獲得了更多的關注。我決定在機器人領域里再走一步&#xff0c;于是想到可以學習單片機。研究了下學習路徑&#xff0c;最后還是選擇先從51單…