Java后端面試高頻題整理(面試版答案)
Java 后端面試高頻題整理(面試版答案)
最近在準(zhǔn)備 Java 后端面試,把一些高頻八股題重新整理了一遍。
這篇文章主要偏“面試回答風(fēng)格”,盡量用淺顯易懂的方式講清楚原理,適合:
- Java 初中級后端
- 校招 / 社招面試
- 八股突擊復(fù)習(xí)
- 博客收藏
Integer 和 int 有什么區(qū)別?為什么泛型只能用包裝類型?
面試版答案
int 是 Java 的基本數(shù)據(jù)類型,Integer 是 int 的包裝類,本質(zhì)上是一個對象。
相比 int,Integer 的主要優(yōu)點有幾個:
1. Integer 可以為 null
Integer a = null;
而 int 不行。
這一點在數(shù)據(jù)庫字段映射、參數(shù)傳遞中非常常見。
2. Integer 可以用于泛型和集合
List<Integer> list = new ArrayList<>();
不能寫:
List<int> list = new ArrayList<>();
因為 Java 泛型底層采用的是“類型擦除”。
泛型編譯后會被擦除成 Object 或其上界類型,而 int 不是對象,不能當(dāng)成 Object 使用。
3. Integer 提供了很多工具方法
比如:
Integer.parseInt() Integer.valueOf() Integer.compare()
4. 自動裝箱和拆箱
Integer a = 10; // 自動裝箱 int b = a; // 自動拆箱
底層本質(zhì):
Integer.valueOf(10) a.intValue()
5. Integer 的缺點
- 占用內(nèi)存更多
- 存在裝箱拆箱開銷
- null 自動拆箱可能 NPE
例如:
Integer a = null; int b = a; // NullPointerException
自動裝箱和拆箱底層怎么實現(xiàn)?
面試版答案
自動裝箱和拆箱本質(zhì)上是 Java 編譯器提供的“語法糖”。
自動裝箱
Integer a = 10;
編譯后:
Integer a = Integer.valueOf(10);
自動拆箱
int b = a;
編譯后:
int b = a.intValue();
Integer 緩存池
Integer a = 100; Integer b = 100; System.out.println(a == b); // true
因為 Integer.valueOf() 默認(rèn)緩存:
-128 ~ 127
范圍內(nèi)的整數(shù)對象。
抽象類和接口有什么區(qū)別?
面試版答案
接口更偏向于“行為規(guī)范”,抽象類更偏向于“模板復(fù)用”。
1. 繼承方式不同
Java:
- 類只能單繼承抽象類
- 可以實現(xiàn)多個接口
class A extends AbstractA class B implements X,Y
2. 成員不同
接口:
- 只能定義常量
- Java8 后支持 default 方法
抽象類:
- 可以有成員變量
- 可以有普通方法
- 可以有構(gòu)造方法
3. 設(shè)計目標(biāo)不同
接口:
- 強(qiáng)調(diào)“能做什么”
抽象類:
- 強(qiáng)調(diào)“是什么”
4. 什么情況下接口不能替代抽象類?
需要共享狀態(tài)
abstract class Animal{
protected String name;
}
需要模板方法模式
abstract class Game{
public final void play(){
init();
start();
end();
}
abstract void init();
}
Java 泛型是什么?解決什么問題?
面試版答案
Java 泛型本質(zhì)是“參數(shù)化類型”。
例如:
List<String> list = new ArrayList<>();
這里的 String 就是類型參數(shù)。
泛型解決的問題
1. 類型安全
沒有泛型:
List list = new ArrayList();
list.add("abc");
list.add(123);
容易:
ClassCastException
有泛型后:
List<String> list = new ArrayList<>();
編譯階段就會檢查類型。
2. 消除強(qiáng)轉(zhuǎn)
String s = list.get(0);
不需要再:
(String)
泛型底層:類型擦除
Java 泛型屬于“偽泛型”。
編譯后:
List<String> List<Integer>
都會擦除成:
List
所以:
a.getClass() == b.getClass()
結(jié)果為:
true
ArrayList 底層數(shù)據(jù)結(jié)構(gòu)
面試版答案
ArrayList 底層是:
Object[]
動態(tài)數(shù)組。
JDK8 的初始化
new ArrayList()
不會立刻創(chuàng)建長度為 10 的數(shù)組。
第一次 add 時才初始化容量為 10。
擴(kuò)容機(jī)制
ArrayList 擴(kuò)容一般為原來的 1.5 倍:
newCapacity = oldCapacity + \frac{oldCapacity}{2}
底層通過:
Arrays.copyOf()
復(fù)制舊數(shù)組。
特點
優(yōu)點:
- 查詢快
- 支持隨機(jī)訪問
缺點:
- 中間插入刪除慢
- 擴(kuò)容有復(fù)制開銷
@Autowired 和 @Resource 的區(qū)別
面試版答案
1. 來源不同
@Autowired
來自 Spring:
org.springframework.beans.factory.annotation.Autowired
@Resource
來自 JSR-250:
javax.annotation.Resource
2. 默認(rèn)注入方式不同
@Autowired
默認(rèn):
byType
按類型注入。
@Resource
默認(rèn):
byName -> byType
優(yōu)先按名稱。
3. 推薦使用方式
Spring 現(xiàn)在更推薦:
構(gòu)造器注入
例如:
@RequiredArgsConstructor
接口慢怎么排查?
面試版答案
一般會從:
監(jiān)控 -> 鏈路 -> SQL -> JVM -> 代碼
逐層排查。
1. 看監(jiān)控
關(guān)注:
- RT
- QPS
- CPU
- 內(nèi)存
- GC
- 線程池
2. 鏈路追蹤
例如:
- SkyWalking
- Arthas
- Zipkin
定位耗時點。
3. 排查 SQL
重點看:
EXPLAIN
觀察:
- 是否走索引
- 是否全表掃描
- 是否回表
- 是否深分頁
4. JVM 排查
查看:
- Full GC
- 線程阻塞
- 內(nèi)存泄漏
MySQL 事務(wù)和隔離級別
面試版答案
事務(wù)具有 ACID 四大特性。
1. 原子性(Atomicity)
要么全部成功,要么全部失敗。
通過:
Undo Log
實現(xiàn)。
2. 一致性(Consistency)
事務(wù)執(zhí)行前后,數(shù)據(jù)必須滿足業(yè)務(wù)規(guī)則。
3. 隔離性(Isolation)
事務(wù)之間互不影響。
通過:
- MVCC
- 鎖機(jī)制
共同實現(xiàn)。
4. 持久性(Durability)
事務(wù)提交后永久保存。
通過:
Redo Log
實現(xiàn)。
MySQL 四種隔離級別
1. 讀未提交
可能出現(xiàn):
臟讀
2. 讀已提交
解決臟讀。
但可能:
不可重復(fù)讀
3. 可重復(fù)讀(MySQL 默認(rèn))
解決不可重復(fù)讀。
4. 串行化
事務(wù)串行執(zhí)行。
并發(fā)性能最低。
MySQL 索引怎么優(yōu)化?
面試版答案
1. 避免索引失效
例如:
where date(create_time)=?
可能導(dǎo)致索引失效。
2. 遵守最左匹配原則
聯(lián)合索引:
(a,b,c)
盡量從左開始匹配。
3. 使用覆蓋索引
避免回表。
4. 使用高區(qū)分度字段
例如:
- 用戶ID
- 手機(jī)號
而不是:
- 性別
- 狀態(tài)
5. 主鍵盡量遞增
減少頁分裂。
MySQL 除了 B+Tree 還有哪些索引?
面試版答案
1. Hash 索引
特點:
- 等值查詢快
- 不支持范圍查詢
2. FullText 全文索引
用于:
文章搜索
3. R-Tree 空間索引
用于:
GIS 地理數(shù)據(jù)
4. Bitmap 位圖索引
適合:
低基數(shù)字段
為什么 MySQL 選擇 B+Tree?
因為 B+Tree:
- 支持范圍查詢
- 支持排序
- IO 次數(shù)少
- 樹高度低
綜合性能最好。
總結(jié)
Java 后端面試?yán)?,很多題并不難。
真正拉開差距的,不是“會不會背”,而是:
- 能不能講清楚原理
- 能不能講出底層邏輯
- 能不能形成體系
建議準(zhǔn)備面試時:
- 不要只背定義
- 要理解為什么這樣設(shè)計
- 學(xué)會從“原理 -> 優(yōu)缺點 -> 場景”去回答
這樣會比單純背八股更容易通過面試。
到此這篇關(guān)于Java后端面試高頻題整理的文章就介紹到這了,更多相關(guān)Java后端面試題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Javaweb使用thymeleaf局部刷新結(jié)合Layui插件實現(xiàn)Html分頁
本文主要介紹了Javaweb使用thymeleaf局部刷新結(jié)合Layui插件實現(xiàn)Html分頁,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
一文帶你熟練掌握J(rèn)ava中的日期時間相關(guān)類
我們在開發(fā)時,除了數(shù)字、數(shù)學(xué)這樣的常用API之外,還有日期時間類,更是會被經(jīng)常使用,比如我們項目中必備的日志功能,需要記錄異常等信息產(chǎn)生的時間,本文就帶各位來學(xué)習(xí)一下相關(guān)的日期時間類有哪些2023-05-05
如何使用Spring Security手動驗證用戶的方法示例
這篇文章主要介紹了如何使用Spring Security手動驗證用戶的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
java如何通過Kerberos認(rèn)證方式連接hive
該文主要介紹了如何在數(shù)據(jù)源管理功能中適配不同數(shù)據(jù)源(如MySQL、PostgreSQL和Hive),特別是如何在SpringBoot3框架下通過Kerberos認(rèn)證與Hive進(jìn)行安全交互,文章詳細(xì)描述了Kerberos認(rèn)證過程,包括配置krb5.conf和keytab文件、處理Hadoop和Hive版本兼容性問題2025-02-02
Mybatis-plus多租戶項目實戰(zhàn)進(jìn)階指南
多租戶是一種軟件架構(gòu)技術(shù),在多用戶的環(huán)境下共有同一套系統(tǒng),并且要注意數(shù)據(jù)之間的隔離性,下面這篇文章主要給大家介紹了關(guān)于Mybatis-plus多租戶項目實戰(zhàn)進(jìn)階的相關(guān)資料,需要的朋友可以參考下2022-02-02
java高效打印一個二維數(shù)組的實例(不用遞歸,不用兩個for循環(huán))
下面小編就為大家?guī)硪黄猨ava高效打印一個二維數(shù)組的實例(不用遞歸,不用兩個for循環(huán))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
Java中的轉(zhuǎn)換流InputStreamReader解讀
InputStreamReader是Java.io包中的一個類,用于將字節(jié)輸入流轉(zhuǎn)換為字符輸入流,它繼承自java.io.Reader類,提供了兩種構(gòu)造方法,可以使用默認(rèn)或指定字符集創(chuàng)建實例,常用方法包括讀取字符、判斷是否準(zhǔn)備好讀取數(shù)據(jù)和關(guān)閉流2024-09-09

