java中高級面試題總結(附帶架構視頻)

作者專注於Java、架構、Linux、小程序、爬蟲、自動化等技術。 工作期間含淚整理出一些資料,微信搜索【程序員高手之路】,回覆 【java】【黑客】【爬蟲】【小程序】【面試】等關鍵字免費獲取資料。技術交流、項目合作可私聊。

目錄

前言

Part 1 java基礎

1.1. JDK的基本的類庫

1.2. java內存模型

1.3. 類加載過程

1.4. Unsafe類

1.5. Session、cookie區別

1.6. 權限問題

1.7. 安全問題

1.8 HashMap實現原理

1.9. HashMap和HashTable的區別

1.9. ArrayList和LinkedList的區別

1.10 設計模式 

1.11 垃圾回收算法

Part 2 多線程問題

多線程問題(必問)

Concurrenthashmap原理分析有用

Volitile關鍵字的作用

Part 3 Spring與ORM映射框架

面試題集錦:

3.1. Spring作用域

3.2. SpringMVC面試題

SpringMVC的流程

SpringMVC與Struts2的區別

過濾器與攔截器區別

4.4. Mybatis面試題

#{}和${}的區別是什麼?

Xml映射文件中,除了常見的select|insert|updae|delete標籤之外,還有哪些標籤?

Mybatis批量插入數據

Part 4 SpringBoot相關

Springboot面試題集錦:

Springboot優點

springboot核心註解

Spring Boot 支持哪些日誌框架

Part 5 數據庫相關

面試題集錦:

什麼是數據庫約束,常見的約束有哪幾種?

樂觀鎖和悲觀鎖

什麼是事務

事務四大特性

事務的併發問題

事務的隔離級別

事務的傳播行爲

sql編寫以及優化(必問)

Part 5 其它問題

怎麼設計一個高併發系統(比如100萬人同時搶票)

Spring cloud(有些公司的項目用不到這個)

java性能優化

java8的新特性

redis相關問題

linux常用命令


前言

這篇文章是我近期面試遇到的一些問題(技術類),做的一個總結。

注意:

1.有些問題沒有標準答案,需要讀者朋友在網上查找。

2.有些問題答案太長,三言兩語道不盡,直接給了鏈接,可以複製鏈接去搜索。

3.有些技術涉及到很多問題,我給了總結的鏈接之後,又給大家列出了我面試遇到的題目

Part 1 java基礎

1.1. JDK的基本的類庫

存放位置:jre/lib/rt.jar(這個問題很簡單,但是很多人答不上來!)

常用的 Java 核心包 (Java Core Package)

java.lang  Java 編程語言的基本類庫(Object、String、StringBuffer、StringBuilder、System、Runtime、Throwable、Exception、Error、Thread、Math等)

java.io 通過數據流、對象序列以及文件系統實現的系統輸入、輸出

java.util 集合類、時間處理模式、日期時間工具等各類常用工具包

其它還有

java.sql 訪問和處理來自於 Java 標準數據源數據的類

java.test 以一種獨立於自然語言的方式處理文本、日期、數字和消息的類和接口

java.math簡明的整數算術以及十進制算術的基本函數

1.2. java內存模型

1.程序計數器:是一個數據結構,用於保存當前正常執行的程序的內存地址。Java虛擬機的多線程就是通過線程輪流切換並分配處理器時間來實現的,爲了線程切換後能恢復到正確的位置,每條線程都需要一個獨立的程序計數器,互不影響,該區域爲“線程私有”。

2.Java虛擬機棧:線程私有的,與線程生命週期相同,用於存儲局部變量表,操作棧,方法返回值。局部變量表放着基本數據類型,還有對象的引用。

3.本地方法棧:跟虛擬機棧很像,不過它是爲虛擬機使用到的Native方法服務。

4.Java堆:所有線程共享的一塊內存區域,對象實例幾乎都在這分配內存。

5.方法區:各個線程共享的區域,儲存虛擬機加載的類信息,常量,靜態變量,編譯後的代碼。

1.3. 類加載過程

參考:https://blog.csdn.net/u010942465/article/details/81709246

1.4. Unsafe類

參考:https://www.cnblogs.com/thomas12112406/p/6510787.html

Unsafe類使Java擁有了像C語言的指針一樣操作內存空間的能力,同時也帶來了指針的問題

1.5. Session、cookie區別

1、cookie數據存放在客戶端,session數據放在服務器上。

2、cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用session。

3、session會在一定時間內保存在服務器上,當訪問增多,會比較佔用你服務器的性能,考慮性能應當使用cookie。

4、不同瀏覽器對cookie的數據大小限制不同,個數限制也不相同。

5、可以考慮將登陸信息等重要信息存放爲session,不重要的信息可以放在cookie中。

1.6. 權限問題

參考:https://blog.csdn.net/Y0Q2T57s/article/details/82921270

1.7. 安全問題

參考:https://blog.csdn.net/wojiushiwo945you/article/details/77920165

1.8 HashMap實現原理

參考:https://blog.csdn.net/T2080305/article/details/82626210

1.9. HashMap和HashTable的區別

1.HashMap繼承了AbstractMap,HashTable繼承Dictionary抽象類,兩者均實現Map接口

2.HashMap和Hashtable的底層實現都是數組+鏈表結構實現、

3.Hashtable是線程安全,HashMap是非線程安全

HashMap的性能會高於Hashtable,我們平時使用時若無特殊需求建議使用HashMap,在多線程環境下若使用HashMap需要使用Collections.synchronizedMap()方法來獲取一個線程安全的集合(Collections.synchronizedMap()實現原理是Collections定義了一個SynchronizedMap的內部類,這個類實現了Map接口,在調用方法時使用synchronized來保證線程同步

4.兩者計算hash的方法不同:

Hashtable計算hash是直接使用key的hashcode對table數組的長度直接進行取模

HashMap計算hash對key的hashcode進行了二次hash,以獲得更好的散列值,然後對table數組長度取摸

5.HashMap可以使用null作爲key,不過建議還是儘量避免這樣使用。HashMap以null作爲key時,總是存儲在table數組的第一個節點上。而Hashtable則不允許null作爲key

6.HashMap的初始容量爲16,Hashtable初始容量爲11,兩者的填充因子默認都是0.75

7.HashMap擴容時是當前容量翻倍即:capacity2,Hashtable擴容時是容量翻倍+1即:capacity2+1

1.9. ArrayList和LinkedList的區別

1、ArrayList和LinkedList可想從名字分析,它們一個是Array(動態數組)的數據結構,一個是Link(鏈表)的數據結構,此外,它們兩個都是對List接口的實現。

前者是數組隊列,相當於動態數組;後者爲雙向鏈表結構,也可當作堆棧、隊列、雙端隊列

2、當隨機訪問List時(get和set操作),ArrayList比LinkedList的效率更高,因爲LinkedList是線性的數據存儲方式,所以需要移動指針從前往後依次查找。

3、當對數據進行增加和刪除的操作時(add和remove操作),LinkedList比ArrayList的效率更高,因爲ArrayList是數組,所以在其中進行增刪操作時,會對操作點之後所有數據的下標索引造成影響,需要進行數據的移動。

4、從利用效率來看,ArrayList自由性較低,因爲它需要手動的設置固定大小的容量,但是它的使用比較方便,只需要創建,然後添加數據,通過調用下標進行使用;而LinkedList自由性較高,能夠動態的隨數據量的變化而變化,但是它不便於使用。

5、ArrayList主要控件開銷在於需要在lList列表預留一定空間;而LinkList主要控件開銷在於需要存儲結點信息以及結點指針信息。

1.10 設計模式 

參考:http://c.biancheng.net/design_pattern/

1.11 垃圾回收算法

參考: https://www.cnblogs.com/jiangtunan/p/11025521.html

 

Part 2 多線程問題

多線程問題(必問)

多線程的面試題太多了,下面的三個鏈接總結的很全面很詳細:

https://www.cnblogs.com/Jansens520/p/8624708.html

https://www.cnblogs.com/wangjintao-0623/p/9727234.html

https://blog.csdn.net/zl1zl2zl3/article/details/81868173

Concurrenthashmap原理分析有用

HashTable容器在競爭激烈的併發環境下表現出效率低下的原因,是因爲所有訪問HashTable的線程都必須競爭同一把鎖,那假如容器裏有多把鎖,每一把鎖用於鎖容器其中一部分數據,那麼當多線程訪問容器裏不同數據段的數據時,線程間就不會存在鎖競爭,從而可以有效的提高併發訪問效率,這就是ConcurrentHashMap所使用的鎖分段技術,首先將數據分成一段一段的存儲,然後給每一段數據配一把鎖,當一個線程佔用鎖訪問其中一個段數據的時候,其他段的數據也能被其他線程訪問。

Volitile關鍵字的作用

參考:https://www.cnblogs.com/xd502djj/p/9873067.html

 

Part 3 Spring與ORM映射框架

面試題集錦:

https://blog.csdn.net/qq_34337272/article/details/90955736

3.1. Spring作用域

singleton:單例模式,當spring創建applicationContext容器的時候,spring會欲初始化所有的該作用域實例,加上lazy-init就可以避免預處理;

prototype:原型模式,每次通過getBean獲取該bean就會新產生一個實例,創建後spring將不再對其管理;

====下面是在web項目下才用到的===

request:搞web的大家都應該明白request的域了吧,就是每次請求都新產生一個實例,和prototype不同就是創建後,接下來的管理,spring依然在監聽;

session:每次會話,同上;

global session:全局的web域,類似於servlet中的application。

3.2. SpringMVC面試題

面試題集錦:

https://blog.csdn.net/a745233700/article/details/80963758

SpringMVC的流程

SpringMVC與Struts2的區別

(1)springmvc的入口是一個servlet即前端控制器(DispatchServlet),而struts2入口是一個filter過慮器(StrutsPrepareAndExecuteFilter)。

(2)springmvc是基於方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,可以設計爲單例或多例(建議單例),struts2是基於類開發,傳遞參數是通過類的屬性,只能設計爲多例。

(3)Struts採用值棧存儲請求和響應的數據,通過OGNL存取數據,springmvc通過參數解析器是將request請求內容解析,並給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最後又將ModelAndView中的模型數據通過reques域傳輸到頁面。Jsp視圖解析器默認使用jstl

過濾器與攔截器區別

①過濾器只能在容器初始化時被調用一次,在action的生命週期中,而攔截器可以多次被調用

②過濾器可以對幾乎所有的請求起作用,攔截器只能對action請求起作用。

③過濾器不能訪問action上下文、值棧裏的對象,而攔截器可以訪問。

④過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。

⑤過濾器是基於函數回調,而攔截器是基於java的反射機制的。

⑥過濾器不能獲取IOC容器中的各個bean,而攔截器可以,這點很重要,在攔截器裏注入一個service,可以調用業務邏輯。

4.4. Mybatis面試題

面試題集錦:

https://blog.csdn.net/a745233700/article/details/80977133

#{}和${}的區別是什麼?

#{}是預編譯處理,${}是字符串替換。

Mybatis在處理#{}時,會將sql中的#{}替換爲?號,調用PreparedStatement的set方法來賦值;

Mybatis在處理${}時,就是把${}替換成變量的值。

使用#{}可以有效的防止SQL注入,提高系統安全性。

Xml映射文件中,除了常見的select|insert|updae|delete標籤之外,還有哪些標籤?

trim | where | set | foreach | if | choose | when | otherwise | bind

Mybatis批量插入數據

可以使用foreach標籤

 

Part 4 SpringBoot相關

Springboot面試題集錦:

https://blog.csdn.net/Kevin_Gu6/article/details/88547424

Springboot優點

內置Tomcat、jetty,簡化配置配置,restful風格

springboot核心註解

SpringbootApplication,包含3個配置springbootConfiguration、enableAutoConfiguration、componentScan

Spring Boot 支持哪些日誌框架

Spring Boot支持Java Util Logging,Log4j2,Lockback作爲日誌框架,如果你使用starters啓動器,Spring Boot將使用Logback作爲默認日誌框架。無論使用哪種日誌框架,Spring Boot都支持配置將日誌輸出到控制檯或者文件中

 

Part 5 數據庫相關

面試題集錦:

https://www.cnblogs.com/wenxiaofei/p/9853682.html

什麼是數據庫約束,常見的約束有哪幾種?

數據庫約束用於保證數據庫表數據的完整性(正確性和一致性)。可以通過定義約束\索引\觸發器來保證數據的完整性。

總體來講,約束可以分爲:

主鍵約束:primary key;

外鍵約束:foreign key;

唯一約束:unique;

檢查約束:check;

空值約束:not null;

默認值約束:default;

樂觀鎖和悲觀鎖

參考:https://blog.csdn.net/qq_34337272/article/details/81072874

什麼是事務

事務是對數據庫中一系列操作進行統一的回滾或者提交的操作,主要用來保證數據的完整性和一致性。

事務四大特性

原子性(Atomicity): 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。

一致性(Consistency): 事務開始前和結束後,數據庫的完整性約束沒有被破壞。比如A向B轉賬,不可能A扣了錢,B卻沒收到。

隔離性(Isolation): 隔離性是當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。

持久性(Durability): 持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。

事務的併發問題

1、髒讀:事務A讀取了事務B更新的數據,然後B回滾操作,那麼A讀取到的數據是髒數據

2、不可重複讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果因此本事務先後兩次讀到的數據結果會不一致。

3、幻讀:幻讀解決了不重複讀,保證了同一個事務裏,查詢的結果都是事務開始時的狀態(一致性)。

例如:事務T1對一個表中所有的行的某個數據項做了從“1”修改爲“2”的操作 這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值還是爲“1”並且提交給數據庫。而操作事務T1的用戶如果再查看剛剛修改的數據,會發現還有跟沒有修改一樣,其實這行是從事務T2中添加的,就好像產生幻覺一樣,這就是發生了幻讀。

事務的隔離級別

1. 讀未提交:另一個事務修改了數據,但尚未提交,而本事務中的SELECT會讀到這些未被提交的數據髒讀

2. 不可重複讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果因此本事務先後兩次讀到的數據結果會不一致。

3. 可重複讀:在同一個事務裏,SELECT的結果是事務開始時時間點的狀態,因此,同樣的SELECT操作讀到的結果會是一致的。但是,會有幻讀現象

4. 串行化:最高的隔離級別,在這個隔離級別下,不會產生任何異常。併發的事務,就像事務是在一個個按照順序執行一樣

事務的傳播行爲

1.PROPAGATION_REQUIRED:如果當前沒有事務,就創建一個新事務,如果當前存在事務,就加入該事務,該設置是最常用的設置。

2.PROPAGATION_SUPPORTS:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行。

3.PROPAGATION_MANDATORY:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就拋出異常。

4.PROPAGATION_REQUIRES_NEW:創建新事務,無論當前存不存在事務,都創建新事務。

5.PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

6.PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。

7.PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。

sql編寫以及優化(必問)

參考:

https://blog.csdn.net/qq_38789941/article/details/83744271

 

Part 5 其它問題

怎麼設計一個高併發系統(比如100萬人同時搶票)

https://blog.csdn.net/java_leejin/article/details/98096274

Spring cloud(有些公司的項目用不到這個)

面試題集錦:

https://blog.csdn.net/hjq_ku/article/details/89504229

https://blog.csdn.net/oldshaui/article/details/90675149

 

java性能優化

http://www.wityx.com/post/424_1_1.html

java8的新特性

https://www.cnblogs.com/onetwo/p/8526374.html

redis相關問題

https://www.cnblogs.com/jasontec/p/9699242.html

linux常用命令

https://blog.csdn.net/qq_26230421/article/details/98359696

 

這些技術都會的話就可以上戰場了

更多精彩內容請關注公衆號:程序員高手之路

在公衆號裏回覆“架構”,免費獲取以下項目視頻教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章