文章目錄
- Java后端面試題
- 0 前言
- 1 涉及知識點
- 2 高頻面試題
- 2.1 MySQL
- 2.1.1 什么是索引,如何創建索引?
- 2.1.2 索引的分類?
- 2.1.3 索引什么時候失效?
- 2.1.4 聚簇索引和非聚簇索引的區別?
- 2.1.5 MySQL如何優化?
- 2.1.6 談一談執行計劃中的常見引數?
- 2.1.7 MySQL的常見引擎和區別?
- 2.1.8 介紹什么是左(右)連接
- 2.1.9 資料庫范式
- 2.2 事務
- 2.2.1 什么是事務?
- 2.2.2 事務的四大特性?
- 2.2.3 事務的隔離級別?
- 2.2.4 Spring中事務的分類?
- 2.3 多執行緒
- 2.3.1 創建執行緒的方式?
- 2.3.2 執行緒池的七個引數?
- 2.3.3 wait()和sleep()區別?
- 2.3.4 執行緒的五種狀態?
- 2.3.5 實作多執行緒推薦使用哪種方式?
- 2.3.6 Synchronized鎖的物件?
- 2.3.7 什么是可重入鎖?
- 2.3.8 什么是死鎖及解決方式?
- 2.3.9 多執行緒導致的常見問題
- 2.4 Java基礎
- 2.4.1 介面和抽象類?
- 2.4.2 LinkedList和ArrayList的區別?
- 2.4.3 Hashmap的底層實作?
- 2.4.4 解釋下什么是OOP?
- 2.4.5 &和&&區別?
- 2.4.6 String可以被繼承么?
- 2.4.7 String、StringBuilder和StringBuffer?
- 2.4.8 ==和equels()?
- 2.4.9 多載和重寫?
- 2.4.10 談談Throwable?
- 2.5 Redis
- 2.5.1 常見的資料型別?
- 2.5.2 你常用的是哪些型別?
- 2.5.3 如何實作分布式鎖?
- 2.5.4 持久化的方式?
- 2.5.5 過期策略?
- 2.5.6 什么是快取穿透、擊穿、雪崩及解決方案?
- 2.6 訊息佇列MQ
- 2.6.1 常見的MQ型別?
- 2.6.2 你常用的是哪個?
- 2.6.3 RabbitMQ如何避免訊息堆積?
- 2.6.4 RabbitMQ如何確保訊息不被重復消費?
- 2.6.5 RabbitMQ如何確保訊息佇列的高可用性?
- 2.6.6 RabbitMQ如何確保訊息不丟失?
- 2.6.7 RabbitMQ如何確保訊息的有序性?
- 2.7 框架
- 2.7.1 #{}和${}?
- 2.7.2 一級快取和二級快取?
- 2.7.3 如何解決資料庫中欄位和Java物件屬性不一致?
- 2.7.4 Bean的作用域?
- 2.7.5 什么是IOC和AOP?
- 2.7.6 SpringMVC的執行流程?
- 2.7.7 SpringMVC的常用注解?
- 2.7.8 Spring中使用哪些設計模式?
- 2.7.9 Spring中事務的傳播行為?
- 2.7.10 如何利用AOP實作事務?
- 2.7.11 @Autowired和@Resource的區別
- 2.7.12 SpringBoot的啟動流程?
- 2.7.13 SpringBoot的常用注解?
- 2.8 SpringCloud
- 2.8.1 你知道哪些組件?
- 2.8.2 專案中用到哪些?
- 2.9 Linux常用命令
- 2.9.1 聊一聊常用命令?
- 2.10 其他
- 3 總結
Java后端面試題
0 前言
這段時間一直在忙著面試,好久沒更了,忙完之后把最近這幾天遇到的面試題整理一下,建議收藏
我主要是Java后端,主要包括以下兩個方面:
- 談談你做過的專案以及負責的模塊(必問)
- Java中的技術點
這里我只對被常問到的面試題進行一下總結:
個人覺得能否面試成功,不僅需要能回答出自己之前做的專案負責的模塊,還要將Java中常見的知識問題熟練地回答出來,
那么下面我就針對面試題進行下總結,還有的話歡迎大家在評論區補充~~
1 涉及知識點
- 關系型資料層:
MySQL - 事務
- 多執行緒
- Java基礎
- 快取:
Redis - 訊息佇列:
RabbitMQ、Kafka - 框架:
Spring、SpringMVC、Mybatis、SpringBoot SpringCloud一些組件- Linux常用命令
- 其他
2 高頻面試題
2.1 MySQL
2.1.1 什么是索引,如何創建索引?
在MySQL中也叫做“鍵”,它是一個特殊的檔案,它保存著資料表里所有記錄的位置資訊,更通俗的來說,資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度 索引的創建: -- 創建索引的語法格式 -- alter table 表名 add index 索引名(列名, ..) -- 給name欄位添加索引 alter table classes add index my_name (name);
2.1.2 索引的分類?
索引有四種型別: 1. 唯一索引:唯一索引是不允許其中任何兩行具有相同索引值的索引,當現有資料中存在重復的鍵值時,大多數資料庫不允許將新創建的唯一索引與表一起保存, 2. 主鍵索引:資料庫表經常有一列或多列組合,其值唯一標識表中的每一行,該列稱為表的主鍵,在資料庫關系圖中為表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定型別,該索引要求主鍵中的每個值都唯一, 3. 聚焦索引:在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同,一個表只能包含一個聚集索引,如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配, 4. 普通索引
2.1.3 索引什么時候失效?
1.如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什么盡量少用or的原因) 注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引 2.對于多列索引,不是使用的第一部分,則不會使用索引 3.like查詢是以%開頭 4.如果列型別是字串,那一定要在條件中將資料使用引號參考起來,否則不使用索引 5.如果mysql估計使用全表掃描要比使用索引快,則不使用索引
2.1.4 聚簇索引和非聚簇索引的區別?
聚簇索引:將資料存盤與索引放到了一塊,索引結構的葉子節點保存了行資料 非聚簇索引:將資料與索引分開存盤,索引結構的葉子節點指向了資料對應的位置
2.1.5 MySQL如何優化?
1 查看慢查詢,優化SQL陳述句 2 建立視圖 3 創建索引 4 分庫分表
2.1.6 談一談執行計劃中的常見引數?
id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra
2.1.7 MySQL的常見引擎和區別?
InnoDB MyISAM 1. InnoDB支持事務,MyISAM不支持,對于InnoDB每一條SQL語言都默認封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin和commit之間,組成一個事務; 2. InnoDB是聚集索引,使用B+Tree作為索引結構,資料檔案是和(主鍵)索引綁在一起的(表資料檔案本身就是按B+Tree組織的一個索引結構),必須要有主鍵,通過主鍵索引效率很高,但是輔助索引需要兩次查詢,先查詢到主鍵,然后再通過主鍵查詢到資料,因此,主鍵不應該過大,因為主鍵太大,其他索引也都會很大,
2.1.8 介紹什么是左(右)連接
左連接:左鏈接是以左邊為參照,右邊少了補NULL,多了洗掉 右鏈接:右鏈接是以右邊為參照,左邊少了補NULL,多了洗掉
2.1.9 資料庫范式
第一范式(1NF): 資料表中的每一列(每個欄位)必須是不可拆分的最小單元,也就是確保每一列的原子性 第二范式(2NF): 滿足1NF后,要求表中的所有列,都必須依賴于主鍵,而不能有任何一列與主鍵沒有關系,也就是說一個表只描述一件事情; 第三范式(3NF): 必須先滿足第二范式(2NF),要求:表中的每一列只與主鍵直接相關而不是間接相關,(表中的每一列只能依賴于主鍵); 第四范式(4NF): 略 第五范式(5NF): 略
2.2 事務
2.2.1 什么是事務?
事務是一組連續的操作,這些操作要么全部成功,要么全部失敗回滾
2.2.2 事務的四大特性?
原子性: 一致性: 隔離性: 持久性:
2.2.3 事務的隔離級別?
讀未提交: 讀已提交: 可重復讀: 串行化:
2.2.4 Spring中事務的分類?
編程式事務: 宣告式事務:
2.3 多執行緒
2.3.1 創建執行緒的方式?
1 繼承Thread類 2 實作Runnable()介面 3 實作Callable()介面 4 使用執行緒池
2.3.2 執行緒池的七個引數?
corePoolSize 執行緒池核心執行緒大小 maximumPoolSize 執行緒池最大執行緒數量 keepAliveTime 空閑執行緒存活時間 threadFactory 執行緒工廠 workQueue 作業佇列 unit 空間執行緒存活時間單位 handler 拒絕策略
2.3.3 wait()和sleep()區別?
共同點: 他們都是在多執行緒的環境下,都可以在程式的呼叫處阻塞指定的毫秒數,并回傳, 不同點: Thread.sleep(long)可以不在synchronized的塊下呼叫,而且使用Thread.sleep()不會丟失當前執行緒對任何物件的同步鎖 wait()會釋放鎖,并且等待notify()和notifyAll()喚醒
2.3.4 執行緒的五種狀態?
創建 就緒 阻塞 運行 死亡
2.3.5 實作多執行緒推薦使用哪種方式?
實作Runnable()介面,因為java是單繼承,Thread()已經繼承了Runnable介面,所以這里推薦前者
2.3.6 Synchronized鎖的物件?
static修飾:鎖的是當前類 沒有static修飾:鎖的是當前物件this
2.3.7 什么是可重入鎖?
指的是可重復可遞回呼叫的鎖,在外層使用鎖之后,在內層仍然可以使用,并且不發生死鎖(前提得是同一個物件或者class),這樣的鎖就叫做可重入鎖, ReentrantLock和synchronized都是可重入鎖
2.3.8 什么是死鎖及解決方式?
死鎖是由于兩個或以上的執行緒互相持有對方需要的資源,導致這些執行緒處于等待狀態,無法執行, 1.破壞“請求和保持”條件 想辦法,讓行程不要那么貪心,自己已經有了資源就不要去競爭那些不可搶占的資源,比如,讓行程在申請資源時,一次性申請所有需要用到的資源,不要一次一次來申請,當申請的資源有一些沒空,那就讓執行緒等待,不過這個方法比較浪費資源,行程可能經常處于饑餓狀態,還有一種方法是,要求行程在申請資源前,要釋放自己擁有的資源, 2.破壞“不可搶占”條件 允許行程進行搶占,方法一:如果去搶資源,被拒絕,就釋放自己的資源,方法二:作業系統允許搶,只要你優先級大,可以搶到, 3.破壞“回圈等待”條件 將系統中的所有資源統一編號,行程可在任何時刻提出資源申請,但所有申請必須按照資源的編號順序(升序)提出
2.3.9 多執行緒導致的常見問題
臟讀: 不可重復讀: 幻讀:
2.4 Java基礎
2.4.1 介面和抽象類?
介面:里面只定義了方法的宣告,當只有一個方法的時候又稱為函式式介面(jdk1.8之后),介面可以多繼承 抽象類:方法體中既可以有方法的宣告,又可以有方法的實作
2.4.2 LinkedList和ArrayList的區別?
1.ArrayList是實作了基于動態陣列的資料結構,LinkedList基于鏈表的資料結構, (LinkedList是雙向鏈表,有next也有previous) 2.對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指標, 3.對于新增和洗掉操作add和remove,LinkedList比較占優勢,因為ArrayList要移動資料,
2.4.3 Hashmap的底層實作?
jdk1.8之前:底層是資料+鏈表 jdk1.8之后:底層是資料+鏈表+紅黑樹
2.4.4 解釋下什么是OOP?
面向物件編程,具體可以自行天馬星空的腦補, 特點:封裝、繼承、多型
2.4.5 &和&&區別?
&:會將判斷條件左右都進行判斷,即使左邊判斷已經為false &&:對左右都判斷,假如左邊為false,那么右邊就不判斷了
2.4.6 String可以被繼承么?
不可以,因為String里面已經有final修飾了,所以不可以再被繼承
2.4.7 String、StringBuilder和StringBuffer?
String: StringBuilder:執行緒不安全,效率高 StringBuffer:執行緒安全,效率略低
2.4.8 ==和equels()?
== 是java提供的等于比較運算子,用來比較兩個變數指向的記憶體地址是否相同.而equals()是Object提供的一個方法.Object中equals()方法的默認實作就是回傳兩個物件==的比較結果.但是equals()可以被重寫,所以我們在具體使用的時候需要關注equals()方法有沒有被重寫.
2.4.9 多載和重寫?
方法的多載和重寫都是實作多型的方式,區別在于前者實作的是編譯時的多型性,而后者實作的是運行時的多型性, 多載發生在一個類中,同名的方法如果有不同的引數串列(引數型別不同、引數個數不同或者二者都不同)則視為多載; 重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的引數串列,有兼容的回傳型別,比父類被重寫方法更好訪問,不能比父類被重寫方法宣告更多的例外(里氏代換原則), 多載對回傳型別沒有特殊的要求,不能根據回傳型別進行區分,
2.4.10 談談Throwable?
Throwable包括Error和Exception error:錯誤,不能編譯通過 exception:分為checkException和RuntimeException,RuntimeException可以進行捕獲和拋出處理
2.5 Redis
2.5.1 常見的資料型別?
字串 哈希 List Set ZSet
2.5.2 你常用的是哪些型別?
字符型和哈希 具體看個人
2.5.3 如何實作分布式鎖?
set key value nx ex 120 實作分布式鎖
2.5.4 持久化的方式?
RDB:將記憶體中資料磁盤記錄下來,可能有些資料的丟失 AOF:只追加寫檔案
2.5.5 過期策略?
定時 定期 懶漢式洗掉
2.5.6 什么是快取穿透、擊穿、雪崩及解決方案?
快取穿透:略 快取擊穿:略 快取雪崩:略
2.6 訊息佇列MQ
2.6.1 常見的MQ型別?
RabbitMQ RocketMQ ActiveMQ Kafka
2.6.2 你常用的是哪個?
RabbitMQ 看個人
2.6.3 RabbitMQ如何避免訊息堆積?
訊息堆積問題產生的原因往往是因為訊息發送的速度超過了消費者訊息處理的速度,因此解決方案無外乎以下三點: - 提高消費者處理速度 - 增加更多消費者 - 增加佇列訊息存盤上限
2.6.4 RabbitMQ如何確保訊息不被重復消費?
訊息重復消費的原因多種多樣,不可避免,所以只能從消費者端入手,只要能保證訊息處理的冪等性就可以確保訊息不被重復消費, 而冪等性的保證又有很多方案: - 給每一條訊息都添加一個唯一id,在本地記錄訊息表及訊息狀態,處理訊息時基于資料庫表的id唯一性做判斷 - 同樣是記錄訊息表,利用訊息狀態欄位實作基于樂觀鎖的判斷,保證冪等 - 基于業務本身的冪等性,比如根據id的洗掉、查詢業務天生冪等;新增、修改等業務可以考慮基于資料庫id唯一性、或者樂觀鎖機制確保冪等,本質與訊息表方案類似,
2.6.5 RabbitMQ如何確保訊息佇列的高可用性?
要實作RabbitMQ的高可用無外乎下面兩點: - 做好交換機、佇列、訊息的持久化 - 搭建RabbitMQ的鏡像集群,做好主從備份,當然也可以使用仲裁佇列代替鏡像集群,
2.6.6 RabbitMQ如何確保訊息不丟失?
RabbitMQ針對訊息傳遞程序中可能發生問題的各個地方,給出了針對性的解決方案: - 生產者發送訊息時可能因為網路問題導致訊息沒有到達交換機: - RabbitMQ提供了publisher confirm機制 - 生產者發送訊息后,可以撰寫ConfirmCallback函式 - 訊息成功到達交換機后,RabbitMQ會呼叫ConfirmCallback通知訊息的發送者,回傳ACK - 訊息如果未到達交換機,RabbitMQ也會呼叫ConfirmCallback通知訊息的發送者,回傳NACK - 訊息超時未發送成功也會拋出例外 - 訊息到達交換機后,如果未能到達佇列,也會導致訊息丟失: - RabbitMQ提供了publisher return機制 - 生產者可以定義ReturnCallback函式 - 訊息到達交換機,未到達佇列,RabbitMQ會呼叫ReturnCallback通知發送者,告知失敗原因 - 訊息到達佇列后,MQ宕機也可能導致丟失訊息: - RabbitMQ提供了持久化功能,集群的主從備份功能 - 訊息持久化,RabbitMQ會將交換機、佇列、訊息持久化到磁盤,宕機重啟可以恢復訊息 - 鏡像集群,仲裁佇列,都可以提供主從備份功能,主節點宕機,從節點會自動切換為主,資料依然在 - 訊息投遞給消費者后,如果消費者處理不當,也可能導致訊息丟失 - SpringAMQP基于RabbitMQ提供了消費者確認機制、消費者重試機制,消費者失敗處理策略: - 消費者的確認機制: - 消費者處理訊息成功,未出現例外時,Spring回傳ACK給RabbitMQ,訊息才被移除 - 消費者處理訊息失敗,拋出例外,宕機,Spring回傳NACK或者不回傳結果,訊息不被例外 - 消費者重試機制: - 默認情況下,消費者處理失敗時,訊息會再次回到MQ佇列,然后投遞給其它消費者,Spring提供的消費者重試機制,則是在處理失敗后不回傳NACK,而是直接在消費者本地重試,多次重試都失敗后,則按照消費者失敗處理策略來處理訊息,避免了訊息頻繁入隊帶來的額外壓力, - 消費者失敗策略: - 當消費者多次本地重試失敗時,訊息默認會丟棄, - Spring提供了Republish策略,在多次重試都失敗,耗盡重試次數后,將訊息重新投遞給指定的例外交換機,并且會攜帶上例外堆疊資訊,幫助定位問題,
2.6.7 RabbitMQ如何確保訊息的有序性?
其實RabbitMQ是佇列存盤,天然具備先進先出的特點,只要訊息的發送是有序的,那么理論上接收也是有序的,不過當一個佇列系結了多個消費者時,可能出現訊息輪詢投遞給消費者的情況,而消費者的處理順序就無法保證了, 因此,要保證訊息的有序性,需要做的下面幾點: - 保證訊息發送的有序性 - 保證一組有序的訊息都發送到同一個佇列 - 保證一個佇列只包含一個消費者
2.7 框架
2.7.1 #{}和${}?
前者會在預編譯之前先對sql陳述句進行編譯,判斷語法是否錯誤,等到真正執行將值替換?占位符,不會導致sql注入,因為將傳入的值作為字串看待,會自動加上引號 后者會導致sql注入,傳過來什么就是什么型別的值
2.7.2 一級快取和二級快取?
一級快取:同一個sqlsession中 二級快取:同一個namespace中,默認不開啟
2.7.3 如何解決資料庫中欄位和Java物件屬性不一致?
使用resultmap 其中association一對一 而collection一對多
2.7.4 Bean的作用域?
默認scope為單例
2.7.5 什么是IOC和AOP?
IOC:控制反轉,是一種設計思想, 在沒有實作IOC的專案中,我們物件的創建和物件之間的依賴是通過硬編碼的方式在程式中,當實作了IOC之后,我們只需要定義的介面,被動的接收物件就可以了, Spring中實作IOC的方式是DI依賴注入, AOP:面向切面編程, 傳統我們是豎直方向開發我們的專案,DAO-Service-Controller層,而通過AOP,我們可以在某一個切入點增強我們想要的業務和邏輯,并且不影響原來的業務,例如實作日志、事務等
2.7.6 SpringMVC的執行流程?
1 一個請求匹配前端控制器 DispatcherServlet 的請求映射路徑(在 web.xml中指定), WEB 容器將該請求轉交給 DispatcherServlet 處理 2 DispatcherServlet 接收到請求后, 將根據 請求資訊 交給 處理器映射器 (HandlerMapping) 3 HandlerMapping 根據用戶的url請求 查找匹配該url的 Handler,并回傳一個執行鏈 4 DispatcherServlet 再請求 處理器配接器(HandlerAdapter) 呼叫相應的 Handler 進行處理并回傳 ModelAndView 給 DispatcherServlet 5 DispatcherServlet 將 ModelAndView 請求 ViewReslover(視圖決議器)決議,回傳具體 View 6 DispatcherServlet 對 View 進行渲染視圖(即將模型資料填充至視圖中) 7 DispatcherServlet 將頁面回應給用戶
2.7.7 SpringMVC的常用注解?
@Component @Repository @Mapper @Service @Controller @RequestMapping @GettingMapping @PostMapping 等等
2.7.8 Spring中使用哪些設計模式?
單例模式 工廠模式 觀察者模式 代理模式
2.7.9 Spring中事務的傳播行為?
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類似的操作,(外層事務拋出例外回滾,那么內層事務必須回滾,反之內層事務并不影響外層事務)
2.7.10 如何利用AOP實作事務?
通過@Aspect注解或者組態檔撰寫 具體 略
2.7.11 @Autowired和@Resource的區別
前者首先通過型別注入,是Spring包提供的,經常配合@Qualifiler 后者通過名字注入,是有java jdk提供的
2.7.12 SpringBoot的啟動流程?
1 通過SpringbootApplication啟動類,啟動專案 2 里面有三個注解@SpringbootConfiguration、@EnableAutoConfiguration、@ComponentScan三個注解加載 3 @EnableAutoConfiguration里面有@import注解告訴我們去autoconfigure包下找到META-INF下面的spring.factories下獲取全域加載配置類 4 按照條件加載全域配置類 5 生效的全域配置類向容器中注入大量的Bean 6 這時候就可以使用注入的Bean了 7 如果我們想要覆寫某個默認值,只需要去組態檔properties中覆寫就可以了
2.7.13 SpringBoot的常用注解?
@Conditional @ConditionalOnBean @ConditionalOnClass @ConditionalOnMissBean @SpringBootApplication 等等
2.8 SpringCloud
2.8.1 你知道哪些組件?
Nacos Eureka Seata Sentinel SpringBootGateway Feign
2.8.2 專案中用到哪些?
略
2.9 Linux常用命令
2.9.1 聊一聊常用命令?
mkdir 創建目錄 cp 復制 rm -rf 刪庫專屬 等等
2.10 其他
這里是你除了上述面試題之外,你用到的其他技術,比如ELK等等,作為你跟面試官談資的條件了
3 總結
上述是我在這兩天遇到面試題,部分答案有的也是網上查詢的,如有雷同,請聯系我洗掉,
PS:希望大家有什么問題可以補充,有什么不足的也可以在評論區提出來,謝謝大家~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/384168.html
標籤:其他
