【面試筆記-Java開發崗】

目錄:

    • 1. synchronized 和 ReentrantLock 的區別及應用場景
    • 2. HashMap 與 LinkedHashMap 的區別
    • 3. ConcurrentHashMap 的數據結構及 JDK1.7 與 JDK1.8 區別
    • 4. Spring 常用的模式及應用場景
    • 5. 事務的四大特性(ACID)
    • 6. 鎖機制:行級鎖與游標鎖
    • 7. 索引的種類與使用場景
    • 8. 慢 SQL 優化
    • 9. Git 常用命令與解決沖突
    • 10. 如何保證線程安全
    • 11. MySQL 存儲引擎
    • 12. Redis 如何使用及應用場景
    • 13. Redis 緩存穿透、擊穿、雪崩有什么區別?如何解決?
    • 14. 你能介紹一下你日常開發一個需求的全流程嗎
    • 15.你能簡單介紹一下你常用的 Spring Cloud 微服務組件嗎?
    • 16. 反問問題

1. synchronized 和 ReentrantLock 的區別及應用場景

(1) 實現機制

  • synchronized:Java 內置關鍵字,依賴 JVM 監視器鎖(Monitor),隱式加鎖/解鎖,不可中斷。
  • ReentrantLock:顯式鎖(需手動調用 lock()/unlock()),支持嘗試鎖(tryLock)、超時、公平鎖(構造函數指定)、條件變量(Condition)。

(2) 靈活性

  • synchronized 簡單但功能有限;ReentrantLock 更靈活,支持復雜場景(如定時鎖、中斷響應)。
    性能
  • JDK 1.6+ 后 synchronized 性能優化(偏向鎖、輕量級鎖),高競爭下 ReentrantLock 可能更優。

(3)應用場景:

  • synchronized:簡單同步需求(如單例模式、小臨界區)。
  • ReentrantLock:需要公平鎖、超時控制或復雜條件變量的場景(如線程池任務調度、高并發資源競爭)。

2. HashMap 與 LinkedHashMap 的區別

(1) 數據結構

  • HashMap:基于哈希表實現,無序。
  • LinkedHashMap:繼承自 HashMap,通過雙向鏈表維護插入順序或訪問順序(LRU 緩存)。

(2)應用場景

  • HashMap:常規鍵值對存儲,無需順序控制。
  • LinkedHashMap:需遍歷順序與插入/訪問順序一致(如緩存、歷史記錄)。

3. ConcurrentHashMap 的數據結構及 JDK1.7 與 JDK1.8 區別

JDK 1.7

  • 分段鎖(Segment):將數據分為多個 Segment,每個 Segment 獨立加鎖,提升并發度(默認 16 個 Segment)。
  • 數據結構:數組 + 鏈表。

JDK 1.8

  • CAS + synchronized:使用 CAS(無鎖操作)和 synchronized(鎖單個鏈表頭節點),減少鎖粒度。
  • 紅黑樹優化:鏈表長度超過閾值(默認 8)時轉為紅黑樹,查詢時間從 O(n) 降為 O(log n)。
    核心改進:減少內存開銷,提升高并發性能。

4. Spring 常用的模式及應用場景

在這里插入圖片描述
Spring 各模塊中設計模式的體現
在這里插入圖片描述
我在項目中使用過 Spring 的代理模式(AOP)實現日志記錄和權限控制,使用模板方法模式封裝通用數據庫操作,使用觀察者模式實現業務事件通知。這些設計模式提升了代碼的可維護性和擴展性。

5. 事務的四大特性(ACID)

  • 原子性(Atomicity):事務內操作要么全成功,要么全失敗回滾。
  • 一致性(Consistency):事務執行前后,數據庫完整性約束不變(如外鍵約束)。
  • 隔離性(Isolation):多個事務并發執行時,相互隔離(隔離級別:讀未提交、讀已提交、可重復讀、串行化)。
  • 持久性(Durability):事務提交后,修改永久保存到數據庫。

6. 鎖機制:行級鎖與游標鎖

  • 行級鎖
    鎖定特定行(如 MySQL InnoDB 的 SELECT … FOR UPDATE),減少鎖沖突,提升并發。
  • 游標鎖(悲觀鎖
    在讀取數據時鎖定整個結果集(如 SQL Server 的 HOLDLOCK),防止其他事務修改,適用于高寫入沖突場景。

7. 索引的種類與使用場景

1. 種類

  • B+ 樹索引:默認索引類型,適用于范圍查詢(如 WHERE id > 100)。
  • 哈希索引:僅支持等值查詢(如 Redis、Memory 引擎)。
  • 全文索引:文本模糊匹配(如 MATCH() AGAINST())。
  • 組合索引:多列聯合索引(遵循最左前綴原則)。

2. 使用場景

  • 主鍵索引:唯一標識記錄。
  • 唯一索引:防止重復值(如用戶名)。
  • 組合索引:優化多條件查詢(如 WHERE name=‘A’ AND age=20)。

8. 慢 SQL 優化

  • 分析工具:EXPLAIN 查看執行計劃,定位全表掃描或臨時表。
EXPLAIN SELECT * FROM your_table WHERE your_condition;
  • 判斷哪些索引是無效的?
    (1)使用 EXPLAIN 分析執行計劃
    EXPLAIN SELECT * FROM orders WHERE customer_id = 123;
    查看 EXPLAIN 的輸出,重點關注以下字段:
    在這里插入圖片描述
    (2) 看索引是否被使用(可通過慢查詢日志 + EXPLAIN 分析)
    啟用慢查詢日志,找出執行時間長的 SQL。
    對這些 SQL 執行 EXPLAIN,看是否使用了索引。
    如果未使用索引,可能是索引失效或設計不合理。
    (3)常見導致索引失效的 SQL 寫法
    在這里插入圖片描述

  • 判斷哪些索引是有效的?
    (1) 看 EXPLAIN 的 type 類型
    在這里插入圖片描述
    (2) 看 rows 字段
    rows 表示 MySQL 估計需要掃描的行數。
    越小越好。
    如果 rows 很大,說明索引可能不夠高效。
    (3) 看 Extra 字段
    在這里插入圖片描述

  • 優化策略**
    (1) 添加索引(避免在低選擇性字段建索引)。
    (2) 避免 SELECT *,只查詢必要字段。
    (3) 分頁優化:大分頁改用游標分頁(如 WHERE id > 1000 LIMIT 10)。
    (4) 拆分復雜 SQL(減少子查詢嵌套)。
    (5) 定期分析表(ANALYZE TABLE 更新統計信息)。

9. Git 常用命令與解決沖突

常用命令

  • git clone:克隆倉庫。
  • git add:添加修改到暫存區。
  • git commit:提交本地倉庫。
  • git push/pull:推送/拉取遠程分支。
  • git branch:查看分支。
  • git merge:合并分支。
  • git rebase:變基(避免合并提交)。
    解決沖突
  • git pull 或 merge 時標記沖突文件。
  • 手動編輯文件,刪除沖突標記(<<<<<<<, =======, >>>>>>>)。
  • git add <文件> 標記沖突已解決。
  • git commit 提交最終版本。

10. 如何保證線程安全

  • 同步機制,使用 synchronized 或 ReentrantLock 控制臨界區訪問。
  • 原子類:AtomicInteger、AtomicReference(CAS 操作)。
  • 線程本地變量:ThreadLocal 存儲線程私有數據(如用戶會話)。
  • 并發工具類:ConcurrentHashMap、CopyOnWriteArrayList。
  • volatile:保證變量可見性(適用于狀態標志)。

11. MySQL 存儲引擎

  • InnoDB
    支持事務、行級鎖、崩潰恢復(默認引擎)。
  • MyISAM
    高速存儲,不支持事務和行鎖,適合只讀或插入密集場景。
  • Memory
    數據存儲在內存中,速度快,適合臨時表。
  • Archive
    高壓縮比,適合歸檔日志數據。

應用場景

  • InnoDB:高并發寫入(如訂單系統)。
  • MyISAM:只讀數據(如靜態資源表)。
  • Memory:臨時緩存(如會話統計)。

12. Redis 如何使用及應用場景

Redis 是一個高性能的內存數據庫,支持多種數據結構,常用于緩存、分布式鎖、計數器、排行榜等場景。在實際項目中,我主要用 Redis 做緩存和計數器。比如在電商系統中,將商品詳情緩存到 Redis,設置 5 分鐘過期時間;在社交系統中,使用 Redis 統計用戶的點贊和評論數,避免頻繁寫數據庫。

典型使用場景包括:

  • 緩存:將熱點數據緩存到 Redis,減少數據庫壓力,提升訪問速度。
  • 分布式鎖:使用 SETNX 或 Redlock 實現跨服務的資源互斥訪問。
  • 計數器:使用 INCR 實現點贊、瀏覽量、訂單號生成等。
  • 排行榜:使用 ZSet 實現游戲積分榜、熱門文章等。
  • 消息隊列:使用 List 或 Pub/Sub 實現任務隊列或事件通知。
  • 限流:使用 INCR + EXPIRE 實現滑動窗口限流,保護后端服務。
  • 用戶簽到:使用 Bitmap 實現簽到統計,節省空間。

13. Redis 緩存穿透、擊穿、雪崩有什么區別?如何解決?

  • 緩存穿透:查詢一個既不在緩存也不在數據庫中的數據(如非法 ID),導致每次請求都打到數據庫。
    • 解決:布隆過濾器(Bloom Filter)攔截非法請求;緩存空值并設置短過期時間。
  • 緩存擊穿:某個熱點 key 突然失效,大量并發請求直接打到數據庫。
    • 解決:設置熱點 key 永不過期;使用互斥鎖(Mutex)或分布式鎖控制重建緩存的并發。
  • 緩存雪崩:大量 key 同時過期或 Redis 宕機,導致數據庫壓力激增。
    • 解決:設置過期時間加隨機值;使用高可用 Redis 集群;緩存降級、限流熔斷。

14. 你能介紹一下你日常開發一個需求的全流程嗎

日常開發一個需求的全流程,我理解為:從需求評審 → 技術設計 → 開發實現 → 代碼審查 → 測試驗證 → 上線部署 → 上線后維護。我會在每個階段都保持清晰的文檔和溝通,確保需求高質量落地。

15.你能簡單介紹一下你常用的 Spring Cloud 微服務組件嗎?

我常用的 Spring Cloud 微服務組件包括 Eureka/Nacos(服務注冊)、Feign(服務調用)、Ribbon(負載均衡)、Hystrix/Sentinel(熔斷限流)、Gateway(網關)、Config(配置中心)、Sleuth/Zipkin(鏈路追蹤),它們分別承擔了服務注冊、通信、容錯、統一入口、配置管理、鏈路監控等職責。
(補充知識)

  • 1. Eureka / Nacos(服務注冊與發現)
    • 功能:服務注冊中心,用于微服務之間的服務發現。
    • 說明:服務啟動后會自動注冊到 Eureka 或 Nacos,其他服務可以通過服務名發現并調用目標服務。
      區別:Nacos 還支持配置中心功能,適合需要動態配置管理的場景。
  • 2. Ribbon(客戶端負載均衡)
    • 功能:在服務調用時,自動選擇一個可用的服務實例,實現負載均衡。
    • 使用場景:結合 Feign 使用,支持輪詢、隨機等策略,實現服務調用的負載均衡。
  • 3. Feign(聲明式服務調用)
    • 功能:簡化服務間調用,通過聲明式接口實現遠程調用。
    • 使用場景:服務 A 調用服務 B 的接口時,只需定義一個接口即可完成調用,底層自動集成 Ribbon 實現負載均衡。
  • 4. Hystrix(服務熔斷與降級)
    • 功能:在服務調用失敗或超時時,觸發熔斷機制,返回降級結果,防止雪崩效應。
    • 使用場景:保護系統穩定性,避免一個服務故障導致整個系統不可用。
    • 注意:Hystrix 已進入維護模式,目前我們項目中使用 Sentinel 替代。
  • 5. Zuul / Gateway(API 網關)
    • 功能:統一入口、路由轉發、權限校驗、限流、鑒權等。
    • 使用場景:所有外部請求都經過網關進入系統,進行統一的鑒權、限流、日志記錄等操作。
    • 區別:Zuul 是 Netflix 的網關組件,性能較差;Spring Cloud Gateway 基于 WebFlux,性能更優,是目前主流選擇。
  • 6. Config(配置中心)
    • 功能:集中管理微服務的配置文件,支持不同環境(dev、test、prod)的配置。
    • 使用場景:微服務啟動時從 Config Server 獲取配置,支持動態刷新,避免頻繁修改配置文件。
  • 7. Sleuth + Zipkin(分布式鏈路追蹤)
    • 功能:記錄請求鏈路,分析服務調用耗時,定位性能瓶頸。
    • 使用場景:排查慢接口、分析調用鏈、查看服務依賴關系。

16. 反問問題

  1. 目前團隊的技術棧是怎樣的?
  2. 項目中是否使用了微服務?使用的是 Spring Cloud 還是 Dubbo?
  3. 這個崗位主要負責哪些模塊?是業務開發、中間件維護,還是平臺開發?
  4. 目前團隊正在做的項目或產品是什么?主要的業務場景有哪些?

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

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

相關文章

CSS :has() 選擇器詳解:為什么它是“父選擇器”?如何實現真正的容器查詢?

一、前言 在傳統的 CSS 中&#xff0c;我們只能根據元素的自身屬性、類名、ID 或其子元素/兄弟元素來設置樣式&#xff0c;卻無法根據其父元素或后代元素的狀態來改變自身樣式。 直到 :has() 選擇器的出現&#xff0c;這一局面被徹底改變。 :has() 被稱為 “父選擇器” 或 “…

李宏毅 Deep Learning

感謝李宏毅老師qwq1. 基礎概念1.1 Machine Learning問題引出&#xff1a;預測后面幾天的觀看人數&#xff1b;初步構建模型&#xff1a;擬合效果不好&#xff0c;就是在原數據上平移了一段距離&#xff1b;此處構建模型的本質&#xff1a;利用特征工程&#xff0c;將“多維特征…

【AI論文】分享即關愛:基于集體強化學習經驗共享的高效語言模型(LM)后訓練方法

摘要&#xff1a;利用強化學習&#xff08;RL&#xff09;對語言模型&#xff08;LMs&#xff09;進行后訓練&#xff0c;無需監督微調即可增強其復雜推理能力&#xff0c;DeepSeek-R1-Zero便證明了這一點。然而&#xff0c;要有效利用強化學習訓練語言模型&#xff0c;需要進行…

工業網關在汽車沖壓車間的應用:EtherNet/IP轉EtherCAT集成實踐

在汽車零部件沖壓車間中&#xff0c;生產線的高效協同與精準控制是提升整體產能的關鍵。隨著自動化設備的多樣化&#xff0c;不同協議的設備之間的通信成為技術難點。例如&#xff0c;羅克韋爾PLC通常采用EtherNet/IP協議&#xff0c;而許多高性能機械臂則依賴EtherCAT協議。如…

【底層機制】【C++】std::move 為什么引入?是什么?怎么實現的?怎么正確用?

C++底層機制推薦閱讀 【C++基礎知識】深入剖析C和C++在內存分配上的區別 【底層機制】【C++】vector 為什么等到滿了才擴容而不是提前擴容? 【底層機制】malloc 在實現時為什么要對大小內存采取不同策略? 【底層機制】剖析 brk 和 sbrk的底層原理 【底層機制】為什么棧的內存…

Redis面試相關

數據過期策略 惰性刪除 當用到那個key的時候再檢查是否過期&#xff0c;過期則刪除&#xff0c;有效則返回key 優點是可以節省檢查過期的時間 缺點是會浪費內存 定期刪除 每隔一段時間對一些key進行檢查并且刪除里面的過期key 有兩種模式 slow模式是定時任務&#xff0c;頻率是…

知識輸出零散沒有體系怎么辦

當面臨知識輸出零散、不成體系的困境時&#xff0c;其根本原因在于未能建立一個從輸入、整合到輸出的閉環系統。要解決這一問題&#xff0c;核心在于構建個人知識管理體系、掌握結構化思維與表達能力、運用合適的工具與方法進行固化、持續實踐并迭代優化。這意味著&#xff0c;…

【C語言選擇排序算法詳解】+ 算法性能優化 + 動態演示實現

文章目錄一、算法介紹二、算法特點三、代碼實現與解析四、代碼解析1. 打印數組函數2. 選擇排序核心邏輯3. 動態展示實現4. 主函數五、算法優化思路與實現優化1&#xff1a;減少交換次數優化原理&#xff1a;優化2&#xff1a;雙向選擇排序優化原理&#xff1a;優化3&#xff1a…

棧(Java)

提示&#xff1a;多練才是王道,加油?(?????)? 棧Java1. 棧2. Java中棧的其中兩種實現方式2.1 Stack類2.1.1 Stack的模擬實現2.2 LinkedList類3. 典型習題講解3.1 逆波蘭表達式求值3.2 匹配括號3.3 合理彈出序列3.4 最小棧1. 棧 棧是一種特殊的線性表,其只允許在固定的一…

LayaAir鼠標(手指)控制相機旋轉,限制角度

切換天空盒腳本掛載到相機身上 const { regClass, property } Laya;regClass() export class SmoothCameraController extends Laya.Script {declare owner: Laya.Camera;// 旋轉靈敏度property({ type: Number, name: "旋轉靈敏度" })public rotationSensitivity:…

【數據結構入門】排序算法(4)歸并排序

目錄 1.排序的原理 1.1 保證子數組有序 1.2 時間復雜度 2. 遞歸實現 2.1 思路 2.2 代碼 3. 非遞歸實現 3.1 思路 3.2 代碼 4.面試題 4.1 題目 4.2 思路 1.排序的原理 歸并排序是外排序&#xff0c;所謂外排序就是說能夠對文件中的數據進行排序。 ①首先&#xff…

FLEXSPI_Init 硬件故障問題

使用官方例程發現FLEXSPI_Init會引起硬件故障&#xff0c;查閱相關帖子發現主要有兩個可能&#xff1a;1、外部閃存配置差異修改 LUT&#xff08;查找表&#xff09;命令&#xff1a;示例中擦除扇區命令為 0xD7&#xff0c;寫狀態寄存器命令為 0x01&#xff0c;需分別改為 閃存…

如何用 Rust 重寫 SQLite 數據庫(一):項目探索

要使用 Rust 重寫 SQLite 數據庫&#xff0c;我們需要實現一個簡化的關系型數據庫核心功能&#xff08;如 SQL 解析、存儲引擎、事務管理&#xff09;。以下是一個分步實踐指南&#xff0c;包含關鍵代碼示例。一、項目規劃 我們將實現一個超簡化數據庫 MiniSQL&#xff0c;支持…

JVM之堆(Heap)

一、堆的核心特性 唯一性與共享性 每個JVM實例僅有一個堆&#xff0c;所有線程共享&#xff0c;但可通過線程私有緩沖區&#xff08;TLAB&#xff09;減少多線程分配沖突。內存結構演變 JDK 7及之前&#xff1a;堆分為新生代&#xff08;Young&#xff09;、老年代&#xff08;…

單片機的RAM與ROM概念

RAM與ROM1、RAM與ROM2、 bss、data、heap、stack、text詳細講解3、詳細探討 TCM、OCRAM 和 HBNRAM 之間的區別及其具體作用。3.1、TCM&#xff08;Tightly Coupled Memory&#xff09;3.2、 OCRAM&#xff08;On Chip RAM&#xff09;3.3、HBNRAM (Hibernate RAM)3.4、總結1、R…

實驗3:事件處理(2學時)

實驗目的&#xff08;1&#xff09;熟練掌握 v-on 指令的用法&#xff0c;學會使用 v-on 指令監聽 DOM 元素的事件&#xff0c;并通過該事件觸發調用事件處理程序。&#xff08;2&#xff09;掌握v-on 指令修飾符的基本用法。實驗內容實現購物車功能的拓展&#xff08;商品數量…

商品庫存扣減方案

文章目錄1. Lua腳本 Redis&#xff08;業界首選&#xff0c;綜合最優&#xff09;2. Redis原子命令&#xff08;DECRBY 結果校驗&#xff09;3. Redis事務&#xff08;MULTI/EXEC&#xff09;4. 分布式鎖&#xff08;基于Redis實現&#xff09;5. Redisson客戶端封裝&#xf…

關于在阿里云DMS誤操作后如何恢復數據的記錄

前言 昨天因客戶員工操作錯誤&#xff0c;導致快遞單號和訂單互換。客戶員工那邊讓筆記修改數據。 于是筆者寫下如下SQL來操作&#xff0c;導致了災難性事故。 update t_order_fed_ex_record set tracking_number 884102170661, master_tracking_number 884102170661, push…

【操作系統核心知識梳理】線程(Thread)重點與易錯點全面總結

在多任務操作系統中&#xff0c;線程是比進程更輕量的執行單元&#xff0c;理解線程的特性和實現方式是掌握并發編程的基礎。本文系統梳理了線程相關的核心知識點和常見誤區&#xff0c;助你夯實操作系統基礎。一、線程的基本概念與引入目的 1.1 什么是線程&#xff1f; 線程是…

深入理解 Python 中的 `__call__` 方法

化身為可調用的對象&#xff1a;深入理解 Python 中的 __call__ 方法 引言&#xff1a;函數與對象的邊界模糊化 在 Python 中&#xff0c;我們最熟悉的概念莫過于函數&#xff08;Function&#xff09; 和對象&#xff08;Object&#xff09;。函數是可調用的&#xff08;calla…