目錄
鎖升級
notify和notifyAll區別
Sleep和Wait的區別
ArrayList和ListedList區別
HashMap擴容原理
ConcurrentHashMap
StringBuffer?和?StringBuilder
事務等級
索引結構
三次握手四次揮手,為什么是三次和四次
Java中重寫和重載的區別和應用場景
ArrayList?的底層數據結構是什么?如何擴容?時間復雜度?
?擴容特點
HashMap?的底層實現原理是什么?JDK?1.8?之前和之后的區別?
String?類型中的?CHAR?和?VARCHAR?區別?使用場景?
Spring IOC和AOP
Mybatis和Mybatis PLUS
TCP和UDP區別
springboot 和Spring MVC
?Spring Boot
Spring MVC
慢sql
慢 SQL 的危害
造成死鎖的原因?怎么解決
什么是java的反射
java中的io流說一下,說一下字節流和字符流的主要區別
鎖升級
無鎖-》偏向鎖-》自旋鎖-》重量級鎖
無鎖:沒有鎖競爭
偏向鎖:只給鎖對象加了個標簽,并沒有真正去加鎖
自旋鎖:通過自旋鎖實現用戶態的鎖
重量級鎖:在鎖競爭非常長激烈的時候,調用CPU的加鎖指令,真正生成LOCK鎖
notify和notifyAll區別
notify可能造成死鎖,而notifyAll不會,notifyAll可以喚醒所有wait方法的線程使其重新進入鎖競爭,而notify只能喚醒一個。notify() 是對notifyAll()的一個優化,但它有很精確的應用場景,并且要求正確使用。
Sleep和Wait的區別
對于sleep()方法,我們首先要知道該方法是屬于Thread類中的。而wait()方法,則是屬于Object類中的。sleep()方法導致了程序暫停執行指定的時間,讓出cpu該其他線程,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復運行狀態。在調用sleep()方法的過程中,線程不會釋放對象鎖。當調用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調用 notify()方法后本線程才進入對象鎖定池準備,獲取對象鎖進入運行狀態。
ArrayList和ListedList區別
ArrayList是動態數組(自動擴容的 Object [])?頻繁隨機訪問(如遍歷或按索引查詢)
- 主要開銷是數組本身(需預分配空間,可能存在內存浪費)。
LinkedList是雙向鏈表(每個節點包含前驅和后繼引用)頻繁頭部 / 尾部插入 / 刪除
- 每個節點需額外存儲前驅和后繼引用(雙向鏈表),內存占用更高。
HashMap擴容原理
HashMap是繼承自AbstractMap類,而Hashtable是繼承自Dictionary類。不過它們都實現了同時實現了map、Cloneable(可復制)、Serializable(可序列化)這三個接口。
為了能讓 HashMap 存數據和取數據的效率高,盡可能地減少 hash 值的碰撞,也就是說盡量把數據能均勻的分配,每個鏈表或者紅黑樹長度盡量相等。我們首先可能會想到 % 取模的操作來實現。
ConcurrentHashMap
ConcurrentHashMap 是線程安全的,HashTable是將每一個方法都加了synchronized修飾,占用性能大,效率低,ConcurrentHashMap 是將每一個哈希桶加了鎖,鎖粒度更小,效率更高
StringBuffer?和?StringBuilder
StringBuffer 是線程安全的,效率低;?StringBuilder是線程不安全的,效率高;
都通過append來拼接,一般單線程環境下用StringBuilder
事務等級
原子性
一致性
持久性
隔離性
其中隔離性分為:讀未提交,讀已提交,可重復讀,串行化
索引結構
B樹
B+樹
B樹的所有節點中同時存儲鍵(key)和值(value)。
B+樹:B 樹的一種變體,所有數據(值)僅存儲在葉子節點中,非葉子節點僅存儲鍵(key)用于索引。葉子節點之間通過指針連接,形成有序鏈表
查詢穩定性
三次握手四次揮手,為什么是三次和四次
三次握手
四次揮手
Java中重寫和重載的區別和應用場景
重寫:子類繼承父類的方法或者調用接口
重載:參數不同
ArrayList?的底層數據結構是什么?如何擴容?時間復雜度?
ArrayList 的核心是一個動態擴容的 Object 數組:
?擴容特點
- 初始容量:默認 16(首次添加元素時創建)。
- 擴容因子:每次擴容為原容量的1.5 倍(
oldCapacity + (oldCapacity >> 1)
)。 - 數組復制:通過
Arrays.copyOf()
實現,本質是 System.arraycopy () 的封裝。
HashMap?的底層實現原理是什么?JDK?1.8?之前和之后的區別?
JDK?1.8?之前:數組 + 鏈表
JDK 1.8 的實現(數組 + 鏈表 + 紅黑樹)
特性 | JDK 1.8 之前 | JDK 1.8 及之后 |
---|---|---|
數據結構 | 數組 + 鏈表 | 數組 + 鏈表 + 紅黑樹 |
鏈表插入方式 | 頭插法 | 尾插法 |
哈希沖突處理 | 鏈表 | 鏈表長度≥8 且數組長度≥64 時轉紅黑樹 |
擴容機制 | 重新計算哈希值 | 通過位運算直接拆分鏈表 |
線程安全問題 | 可能形成循環鏈表 | 避免循環鏈表,但仍非線程安全 |
哈希函數復雜度 | 多次位移 + 異或 | 一次異或 |
查找時間復雜度 | 最壞 O (n) | 最壞 O (log n) |
String?類型中的?CHAR?和?VARCHAR?區別?使用場景?
維度 | CHAR(固定長度) | VARCHAR(可變長度) |
---|---|---|
存儲方式 | 固定長度存儲,不足部分用空格填充 | 實際長度 + 1/2 字節長度前綴(L+1/L+2) |
最大長度 | 0-255 字符(MySQL 5.0.3 之前為 255 字節) | 0-65,535 字節(受行最大長度限制) |
空間效率 | 可能浪費空間(如存儲短字符串時) | 更節省空間(僅存儲實際內容 + 前綴) |
檢索效率 | 讀取速度稍快(固定偏移量) | 需先解析長度前綴,略慢 |
尾部空格處理 | 存儲時保留空格,查詢時自動截斷 | 存儲和查詢時均保留空格 |
Spring IOC和AOP
-
AOP 的思想:
將橫切關注點與業務邏輯分離,通過 “切面” 統一處理。
特性 | IOC | AOP |
---|---|---|
核心思想 | 將對象創建和依賴管理交給容器 | 將橫切關注點與業務邏輯分離 |
實現方式 | 依賴注入(構造器 / Setter / 注解) | 動態代理(JDK/CGLIB)、AspectJ |
應用場景 | 組件解耦、配置外部化 | 事務、日志、權限、性能監控 |
優勢 | 降低耦合、提高可測試性 | 減少重復代碼、增強可維護性 |
Mybatis和Mybatis PLUS
Mybatis是一個半ORM(對象關系映射)框架,它內部封裝了JDBC。程序員直接編寫原生態sql,可以嚴格控制sql執行性能,靈活度高。
MyBatis-Plus(簡稱 MP)是一個MyBatis 的增強工具,在不改變 MyBatis 原有功能的基礎上,通過簡化 CRUD 操作、提供代碼生成器和條件構造器等功能,大幅提升開發效率。
TCP和UDP區別
維度 | TCP(傳輸控制協議) | UDP(用戶數據報協議) |
---|---|---|
連接性 | 面向連接(三次握手建立連接) | 無連接(直接發送數據) |
可靠性 | 可靠傳輸(確認機制、重傳機制、排序) | 不可靠傳輸(不保證送達或順序) |
傳輸效率 | 較低(需維護連接狀態和重傳機制) | 較高(無連接開銷和重傳) |
數據包大小 | 無限制(分段傳輸) | 受限于 MTU(通常≤65,507 字節) |
傳輸順序 | 保證有序 | 不保證有序 |
擁塞控制 | 有(慢啟動、擁塞避免、快速重傳等) | 無(可能導致網絡擁塞) |
應用場景 | 文件傳輸、網頁瀏覽、郵件收發等 | 實時音視頻流、游戲、DNS 查詢等 |
springboot 和Spring MVC
?Spring Boot
- 定位:
簡化 Spring 應用開發的工具集,通過自動配置和約定大于配置原則,降低 Spring 上手門檻。 - 核心功能:
- 自動配置(根據依賴自動配置 Spring MVC、數據庫等)
Spring MVC
- 定位:
Spring 框架的 Web 模塊,基于 Servlet API 構建,提供 MVC(模型 - 視圖 - 控制器)架構支持。 - 核心功能:
- 請求路由(
@RequestMapping
) - 參數綁定
- 視圖解析(JSP、Thymeleaf 等)
- 請求路由(
慢sql
慢 SQL 的危害
- 阻塞資源:
長時間占用數據庫連接和鎖,影響其他業務。 - 拖慢系統:
導致接口響應超時,甚至引發雪崩效應。 - 增加成本:
迫使數據庫擴容,增加硬件和維護成本。
造成死鎖的原因?怎么解決
什么是java的反射
反射機制是在運行時,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意個對象,都能夠調用它的任意一個方法。在java中,只要給定類的名字,就可以通過反射機制來獲得類的所有信息
java中的io流說一下,說一下字節流和字符流的主要區別
特性 | 字節流(Byte Stream) | 字符流(Character Stream) |
---|---|---|
基類 | InputStream ?/?OutputStream | Reader ?/?Writer |
處理單位 | 8 位字節(byte) | 16 位 Unicode 字符(char) |
適用場景 | 二進制文件(圖片、視頻、壓縮包等) | 文本文件(.txt、.java、.json 等) |
是否緩沖 | 無內置字符編碼處理,直接讀寫字節 | 內置編碼轉換(如 UTF-8、GBK) |