多線程和並發、MySQL、Spring等問題是Java技術面試中面試官最喜歡問的問題。在這裡,從面試的角度列出了大部分重要的問題,但是你仍然應該牢固的掌握Java基礎知識來對應日後碰到的問題。以下的各大知識點的「靈魂拷問」能夠幫助你掃除面試中遇到的所有難題!
更多精彩,請看下文:
Java並發編程面試靈魂百問:
- 現在有 T1、T2、T3 三個線程,你怎樣保證 T2 在 T1 執行完後執行,T3 在 T2 執行完 後執行?
這個線程問題通常會在第一輪或電話面試階段被問到,目的是檢測你對 」join 」方法是否熟悉。這個多線程問題比較簡單,可以用 join 方法實現 - 在 Java 中 Lock 接口比 synchronized 塊的優勢是什麼?
你需要實現一個高效的緩存,它 允許多個用戶讀,但只允許一個用戶寫,以此來保持它的完整性,你會怎樣去實現它?
lock 接口在多線程和並發編程中最大的優勢是它們為讀和寫分別提供了鎖,它能滿足你寫像 ConcurrentHashMap 這樣的高性能數據結構和有條件的阻塞。Java 線程面試的問題越來 越會根據面試者的回答來提問。我強烈建議在你去參加多線程的面試之前認真讀一下 Locks, 因為當前其大量用於構建電子交易終統的客戶端緩存和交易連接空間 - 在 java 中 wait 和 sleep 方法的不同?
通常會在電話面試中經常被問到的 Java 線程面試問題。最大的不同是在等待時 wait 會釋 放 鎖,而 sleep 一直持有鎖。Wait 通常被用於線程間交互,sleep 通常被用於暫停執行 - 用 Java 實現阻塞隊列。
這是一個相對艱難的多線程面試問題,它能達到很多的目的。
第一,它可以檢測侯選者是否能實際的用 Java 線程寫程序;
第二,可以檢測侯選者對並發場景的理解,並且你可以根據這個問很多問題。如果他用 wait()和 notify()方法來實現阻塞隊列,你可以要求他用最新的 Java 5 中的並發類來再寫 一次。 - 用 Java 寫代碼來解決生產者——消費者問題。
與上面的問題很類似,但這個問題更經典,有些時候面試都會問下面的問題。在 Java 中怎麼解決生產者——消費者問題,當然有很多解決方法,我已經分享了一種用阻塞隊列實現的方法。有些時候他們甚至會問怎麼實現哲學家進餐問題。 - 用 Java 編程一個會導致死鎖的程序,你將怎麼解決?
這是我最喜歡的 Java 線程面試問題,因為即使死鎖問題在寫多線程並發程序時非常普遍, 但是很多侯選者並不能寫 deadlock free code(無死鎖代碼?),他們很掙扎。只要告訴他們,你有N個資源和N個線程,並且你需要所有的資源來完成一個操作。為了簡單這裡 的 n 可以替換為 2,越大的數據會使問題看起來更複雜。通過避免 Java 中的死鎖來得到關於死鎖的更多信息 - 什麼是原子操作,Java 中的原子操作是什麼?
非常簡單的 java 線程面試問題,接下來的問題是你需要同步一個原子操作。 - Java 中的 volatile 關鍵是什麼作用?怎樣使用它?在 Java 中它跟 synchronized 方法有什麼不同?
自從 Java 5 和 Java 內存模型改變以後,基於 volatile 關鍵字的線程問題越來越流行。應 該準備好回答關於 volatile 變量怎樣在並發環境中確保可見性 - 什麼是競爭條件?你怎樣發現和解決競爭?
這是一道出現在多線程面試的高級階段的問題。大多數的面試官會問最近你遇到的競爭條件,以及你是怎麼解決的。有些時間他們會寫簡單的代碼,然後讓你檢測出代碼的競爭條 件。可以參考我之前發布的關於 Java 競爭條件的文章。在我看來這是最好的 java線程面試問題之一 - 你將如何使用 threaddump?你將如何分析 Thread dump?
在 UNIX 中你可以使用 kill -3,然後 thread dump 將會列印日誌,在 windows 中你可以使用」CTRL+Break 」。非常簡單和專業的線程面試問題,但是如果他問你怎樣分析它,就會很棘手。
由於篇幅原因,在這就不做全部展示了,這些題我已經整理成pdf文檔免費分享給那些有需要的朋友,同時整理也花費了蠻多時間,有需要的朋友可以幫忙轉發分享下然後私信關鍵詞【面試資料】即可獲取免費領取方式
MySQL面試靈魂百問
- 什麼是索引?
索引是一種數據結構,可以幫助我們快速的進行數據的查找. - 索引是個什麼樣的數據結構呢?
索引的數據結構和具體存儲引擎的實現有關, 在 MySQL 中使用較多的索引有 Hash 索引,B+樹索引等,而我們經常使用的 InnoDB 存儲引擎的默認索引實現 為:B+樹索引. - Hash 索引和 B+樹所有有什麼區別或者說優劣呢?
hash 索引進行等值查詢更快(一般情況下),但是卻無法進行範圍查詢
因為在 hash 索引中經過 hash 函數建立索引之後,索引的順序與原順序無法保持 一致,不能支持範圍查詢.而 B+樹的的所有節點皆遵循(左節點小於父節點,右節點 大於父節點,多叉樹也類似),天然支持範圍
hash 索引不支持使用索引進行排序,原理同上.
hash 索引不支持模糊查詢以及多列索引的最左前綴匹配.原理也是因為 hash 函數的不可預測.AAAA 和 AAAAB 的索引沒有相關性 - 上面提到了 B+樹在滿足聚簇索引和覆蓋索引的時候不需要回表查詢數據,什 麼是聚簇索引?
在 B+樹的索引中,葉子節點可能存儲了當前的 key 值,也可能存儲了當前的 key 值以及整行的數據,這就是聚簇索引和非聚簇索引. 在 InnoDB 中,只有主鍵索引 是聚簇索引,如果沒有主鍵,則挑選一個唯一鍵建立聚簇索引.如果沒有唯一鍵,則 隱式的生成一個鍵來建立聚簇索引. - 非聚簇索引一定會回表查詢嗎?
不一定,這涉及到查詢語句所要求的欄位是否全部命中了索引,如果全部命中了索 引,那麼就不必再進行回表查詢. - 在建立索引的時候,都有哪些需要考慮的因素呢?
建立索引的時候一般要考慮到欄位的使用頻率,經常作為條件進行查詢的欄位比 較適合.如果需要建立聯合索引的話,還需要考慮聯合索引中的順序.此外也要考 慮其他方面,比如防止過多的所有對表造成太大的壓力.這些都和實際的表結構以 及查詢方式有關 - 聯合索引是什麼?為什麼需要注意聯合索引中的順序?
MySQL 可以使用多個欄位同時建立一個索引,叫做聯合索引.在聯合索引中,如果 想要命中索引,需要按照建立索引時的欄位順序挨個使用,否則無法命中索引 - 什麼是事務?
事務是一系列的操作,他們要符合 ACID 特性.最常見的理解就是:事務中的操作要 麼全部成功,要麼全部失敗.但是只是這樣還不夠的 - ACID 是什麼?可以詳細說一下嗎?
A=Atomicity 原子性:就是上面說的,要麼全部成功,要麼全部失敗.不可能只執行一部分操作.
C=Consistency 系統(資料庫)總是從一個一致性的狀態轉移到另一個一致性的狀態,不會存在中間狀態. I=Isolation 隔離性: 通常來說:一個事務在完全提交之前,對其他事務是不可見的.注意前面 的通常來說加了紅色,意味著有例外情況.
D=Durability 持久性:一旦事務提交,那麼就永遠是這樣子了,哪怕系統崩潰也不會影響到這個 事務的結果. - 同時有多個事務在進行會怎麼樣呢?
多事務的並發進行一般會造成以下幾個問題:
髒讀: A 事務讀取到了 B 事務未提交的內容,而 B 事務後面進行了回滾.
不可重複讀: 當設置 A 事務只能讀取 B 事務已經提交的部分,會造成在 A 事務 內的兩次查詢,結果竟然不一樣,因為在此期間 B 事務進行了提交操作.
幻讀: A 事務讀取了一個範圍的內容,而同時 B 事務在此期間插入了一條數據. 造成"幻覺".
Spring面試靈魂百問
- 談談對 Spring IoC 的理解?
IoC Inverse of Control 反轉控制的概念。將之前程序中需要手動創建對象的操 作,交由 Spring 框架來實現,創建對象的操作被反轉到了 Spring 框架。對 象的生命周期由 Spring 來管理,直接從 Spring 那裡去獲取一個對象。 - 談談對 Spring DI 的理解?
DI Dependency Injection 依賴注入。Spring 框架創建 Bean 對象時,動態 的將依賴對象注入到 Bean 組件中,實現依賴對象的注入。 - BeanFactory 接口和 ApplicationContext 接口不同點是什麼?
.ApplicationContext 接口繼承 BeanFactory 接口,Spring 核心工廠 是 BeanFactory,BeanFactory 採取延遲加載,第一次 getBean 時才 會初始化 Bean,ApplicationContext 是會在加載配置文件時初始化 Bean。
.ApplicationContext 是對 BeanFactory 擴展,它可以進行國際化處理、 事件傳遞和 Bean 自動裝配以及各種不同應用層的 Context 實現。
開發中基本都在使用ApplicationContext,Web項目使用WebApplicationContext ,很少用到 BeanFactory。 - 請介紹你熟悉的 Spring 核心類,並說明有什麼作用?
. BeanFactory:產生一個新的實例,可以實現單例模式
. BeanWrapper:提供統一的 get 及 set 方法
. ApplicationContext:提供框架的實現,包括 BeanFactory 的所有功能。 - 介紹一下 Spring 的事務的了解?
事務是資料庫操作的最小工作單元,是作為單個邏輯工作單元執行的一系列操 作;這些操作作為一個整體一起向系統提交,要麼都執行、要麼都不執行;事務 是一組不可再分割的操作集合(工作邏輯單元)。 - 解釋 AOP 模塊
AOP(Aspect-Oriented Programming)是一種程序設計類型,它通過分離橫 切關注點來增加程序的模塊化。AOP 在不修改現有代碼的情況下對現有代碼添 加功能,這個是 AOP 最重要的能力。 - Spring 的通知類型有哪些,請簡單介紹一下?
Spring 的通知類型總共有 5 種:前置通知、環繞通知、後置通知、異常通知、 最終通知。
. 前置通知(Before advice):在目標方法執行之前執行的通知。在某連 接點( join point )之前執行的通知,但這個通知不能阻止連接點前的 執行(除非它拋出一個異常)。
. 環繞通知(Around Advice): 在目標方法執行之前和之後都可以執行 額外代碼的通知。也可以選擇是否繼續執行連接點或直接返回它們自己的 返回值或拋出異常來結束執行。
. 後置通知(After (finally) advice): 目標方法執行之後(某連接點退 出的時候)執行的通知(不論是正常返回還是異常退出)。
. 異常後通知(After throwing advice):在方法拋出異常退出時執行的 通知。
. 最終通知(After returning advice): 在某連接點(join point)正 常完成後執行的通知:例如,一個方法沒有拋出任何異常,正常返回。 - Spring 通知類型使用場景分別有哪些?
- 請介紹一下你對 Spring Beans 的理解?
. Spring Beans 是被實例的,組裝的及被 Spring 容器管理的 Java 對象
. Spring Beans 會被 Spring 容器自動完成 @bean 對象的實例化
. Spring 框架定義的 Beans 都是默認為單例,也可以配置為多例 - Spring 有哪些優點?
. 提供控制反轉能力,將對象的創建交給了 Spring,降低了代碼耦合性、 侵入性
. Spring 是 POJO 編程,使得可持續構建和可測試能力提高
. Spring 是開源免費的
. 方便集成各種優秀的框架
最後
再免費分享一波我的Java專題面試真題+視頻學習詳解+Java進階學習書籍
參考學習資料:Java核心技術筆記
JVM,集合,HTTP網絡,多線程並發,JAVA基礎,Spring,微服務,Zookeeper,Kafka,RabbitMQ,Hbase,消息中間件,MongoDB,設計模式,負載均衡,資料庫,一致性哈希,算法,數據結構,加密算法,分布式緩存,Netty,Linux,Tomcat,Nginx,Redis等
各類學習書籍整理:《Redis實戰》、《使用SpringCloud和Docker實戰微服務》、《Spring Boot實戰》、《Spring源碼深度解析》、《分布式服務框架原理與實踐》、《MySQL從入門到項目實踐》等等
各類面試真題整理:BAT面試常問80題、分布式架構、高可擴展、高性能、高並發、Jvm、Spring、MyBatis、Redis、ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx、性能優化、Memcached等
視頻學習詳解:分布式系列+框架源碼系列+性能調優系列
本文的重點是你有沒有收穫與成長,其餘的都不重要,希望讀者們能謹記這一點。
整理不易,需要的朋友可以幫忙轉發一下,關注我私信【資料】即可免費獲取以上我整理的全部資料!!!
文章來源: https://twgreatdaily.com/zh-cn/ULNDG28BMH2_cNUgLLeL.html