Mar 16 2026
sevencoding -
Java對象頭:深入理解對象存儲的核心機制
Java對象結構
實例化一個Java對象之後,該對象在內存中的結構是怎麼樣的?Java對象(Object實例)結構包括三部分:對象頭、對象體和對齊字節,具體下圖所示
Java對象的三部分
對象頭
對象頭包括三個字段,第一個字段叫作Mark Word(標記字),用於存儲自身運行時的數據,例如GC標誌位、哈希碼、鎖狀態等信息。
第二個字段叫作Class Pointer(類對象指針),用於存放方法區C
後端
Mar 13 2026
sevencoding -
類字節碼:揭開Java虛擬機運行機制的神秘面紗
概述
計算機是不能直接運行java代碼的,必須要先運行java虛擬機,再由java虛擬機運行編譯後的java代碼。
因為在cpu層面看來計算機中所有的操作都是一個個指令的運行彙集而成的,java是高級語言,只有人類才能理解其邏輯,計算機是無法識別的,所以java代碼必須要先編譯成字節碼文件,jvm才能正確識別代碼轉換後的指令並將其運行。
Java代碼間接翻譯成字節碼,儲存字節碼的文件再交由運行於不
後端
Mar 12 2026
sevencoding -
第一批被龍蝦氣到的人出現了
引言
我朋友,一個脾氣温和、情緒穩定的成年人,今天,在電腦前憋出了他今年第一句字正腔圓的國罵。
對象不是甲方,不是隊友,而是一個AI——確切説,是一個花了他不少錢、號稱能當“私人數字助理”的玩意兒,花名龍蝦。
事情得從頭説起。那天下午,他喜氣洋洋地跟我顯擺,説也養了個龍蝦,能自動整理AI資訊,能給它下發定時任務,讓它完成本該他完成的任務。“這下爽了,終於能躺着幹活了!”
最開始,它確實像個精英助
後端
Mar 11 2026
sevencoding -
NIO的零拷貝如何實現高效數據傳輸?
Java NIO零拷貝
在 Java NIO 中的通道(Channel)就相當於操作系統的內核空間(kernel space)的緩衝區,而緩衝區(Buffer)對應的相當於操作系統的用户空間(user space)中的用户緩衝區(user buffer)。
通道(Channel)是全雙工的(雙向傳輸),它既可能是讀緩衝區(read buffer),也可能是網絡緩衝區(socket buffer
後端
Mar 09 2026
sevencoding -
NIO:解開非阻塞I/O高併發編程的秘密
流與塊
Standard IO是對字節流的讀寫,在進行IO之前,首先創建一個流對象,流對象進行讀寫操作都是按字節 ,一個字節一個字節的來讀或寫。而NIO把IO抽象成塊,類似磁盤的讀寫,每次IO操作的單位都是一個塊,塊被讀入內存之後就是一個byte[],NIO一次可以讀或寫多個字節。
I/O 與 NIO 最重要的區別是數據打包和傳輸的方式,I/O 以流的方式處理數據,而 NIO 以塊的方式處理數據。
後端
Mar 07 2026
sevencoding -
劍指offer-81、⼆叉搜索樹的最近公共祖先
題⽬描述
給定⼀個⼆叉搜索樹, 找到該樹中兩個指定節點的最近公共祖先。
對於該題的最近的公共祖先定義:對於有根樹T的兩個結點p 、q ,最近公共祖先LCA(T,p,q)表示⼀個結點x ,滿⾜x 是p 和q 的祖先且x 的深度儘可能⼤。在這⾥,⼀個節點也可以是它⾃⼰的祖先.
⼆叉搜索樹是若它的左⼦樹不空,則左⼦樹上所有結點的值均⼩於它的根結點的值; 若它的右⼦樹不空,則右⼦樹上所有結點的值均⼤
後端
Mar 05 2026
sevencoding -
BIO詳解:解鎖阻塞IO的使用方式
關於同步/異步,阻塞/非阻塞,Unix IO模型,可以先看這篇文章網絡系統 - Unix IO模型
BIO概述
阻塞式IO。也就是説io沒有就緒的時候,操作IO當前線程會被阻塞。也就是用户線程需要等待IO線程完成
服務器實現模式為一個連接一個線程,也就是説,客户端每當有一個連接請求的時候,服務器就需要啓動一個對應線程進行處理。但是如果這個連接不做任何事情,就會造成不必要的線程開銷。這種模型一般適用
後端
Mar 04 2026
sevencoding -
劍指offer-80、⼆叉樹中和為某⼀值的路徑(二)
題⽬描述
給定⼀個⼆叉樹root和⼀個整數值 sum ,求該樹有多少路徑的的節點值之和等於 sum 。
該題路徑定義不需要從根節點開始,也不需要在葉⼦節點結束,但是⼀定是從⽗親節點往下到孩⼦節點
總節點數⽬為 n
保證最後返回的路徑個數在整形範圍內
假如⼆叉樹 root 為 {1,2,3,4,5,4,3,#,#,-1} , sum=6 ,那麼總共如下所示,
思路及解答
雙重遞歸法(暴力
後端
Mar 03 2026
sevencoding -
劍指offer-79、最⻓不含重複字符的⼦字符串
題目描述
請從字符串中找出⼀個最⻓的不包含重複字符的⼦字符串,計算該最⻓⼦字符串的⻓度。
數據範圍: ⻓度⼩於40000
示例1
輸⼊:"abcabcbb"
返回值:3
説明:因為⽆重複字符的最⻓⼦串是"abc",所以其⻓度為 3。
示例2
輸⼊:"bbbbb"
返回值:1
説明:因為⽆重複字符的最⻓⼦串是"b",所以其⻓度為 1
示例3
輸⼊:"pwwk
後端
Mar 02 2026
sevencoding -
虛擬線程深度解析:輕量併發編程的未來趨勢
這是Java19新增的預覽版功能,到Java21正式可以使用
簡介
虛擬線程是一種用户態下的線程,類似go語言中的goroutines 和Erlang中的processes,虛擬線程並非比線程快,而是提高了應用的吞吐量,相比於傳統的線程是由操作系統調度來看,虛擬線程是我們自己程序調度的線程。如果你對之前java提供的線程API比較熟悉了,那麼在學習虛擬線程的時候會比較輕鬆,傳統線程能運行的代碼,虛
後端
Feb 27 2026
sevencoding -
Condition底層機制剖析:多線程等待與通知機制
概述
Condition 是一個多線程協調通信的工具類,可以讓某些線程一起等待某個條件(condition),只有滿足條件時,線程才會被喚醒。
在使用Lock之前,使用的最多的同步方式應該是synchronized關鍵字來實現同步方式了。配合Object的wait()、notify()系列方法可以實現等待/通知模式。
Condition接口也提供了類似Object的監視器方法
後端
Feb 26 2026
sevencoding -
劍指offer-78、求平⽅根
題⽬描述
給定⼀個⾮負整數 x ,計算並返回 x 的平⽅根,即實現 int sqrt(int x) 函數。
正數的平⽅根有兩個,只輸出其中的正數平⽅根。如果平⽅根不是整數,輸出只保留整數的部分,⼩數部分將被捨去。
示例1
輸⼊:8
返回值:2
解釋:8 的平⽅根是 2.82842…,由於⼩數部分將被捨去,所以返回 2
思路及解答
暴力枚舉
從0開始遞增,找到最大的i滿足i² ≤
後端
Feb 25 2026
sevencoding -
劍指offer-77、打印從1到最⼤的n位數
題⽬描述
輸⼊數字 n ,按順序打印出從 1 到最⼤的 n 位⼗進制數。⽐如輸⼊ 3 ,則打印出 1 、2 、3⼀直到最⼤的 3 位數 999 。
⽤返回⼀個整數列表來代替打印
n 為正整數
示例1
輸⼊:1
返回值:[1,2,3,4,5,6,7,8,9]
思路及解答
直接計算
不太清楚這道題是要考察什麼(苦笑),⼏乎都是⼀個循環能解決的事情,仔細想了⼀下,也並沒有想到其他⽐較
後端
Feb 24 2026
sevencoding -
CompletableFuture深度解析:異步編程與任務編排的實現
前言
CompletableFuture是jdk8的新特性。CompletableFuture的實現與使用上,處處體現出了函數式異步編程的味道。一個CompletableFuture對象可以被一個環節接一個環節的處理、也可以對兩個或者多個CompletableFuture進行組合處理或者等待結果完成。通過對CompletableFuture各種方法的合理使用與組合搭配,可以在很多的場景都可以應付自
後端
Feb 13 2026
sevencoding -
LockSupport深度解析:線程阻塞與喚醒的底層實現原理
LockSupport簡介
LockSupprot 用來阻塞和喚醒線程,底層實現依賴於Unsafe 類。
LockSupport用來創建鎖和其他同步類的基本線程阻塞原語。簡而言之,當調用LockSupport.park時,表示當前線程將會等待,直至獲得許可,當調用LockSupport.unpark時,必須把等待獲得許可的線程作為參數進行傳遞,好讓此線程繼續運行。在AQS中大量使用,AQS最終都是
後端
Feb 12 2026
sevencoding -
劍指offer-76、刪除鏈表的節點
題⽬描述
給定單向鏈表的頭指針和⼀個要刪除的節點的值,定義⼀個函數刪除該節點。返回刪除後的鏈表的頭節點。
此題對⽐原題有改動
題⽬保證鏈表中節點的值互不相同
該題只會輸出返回的鏈表和結果做對⽐,所以若使⽤ C 或 C++ 語⾔,你不需要 free 或 delete 被刪除的節點
數據範圍:
0=鏈表節點值=10000
0=鏈表⻓度=10000
示例1
輸⼊:{2,5,1,9},5
後端
Feb 11 2026
sevencoding -
劍指offer-75、買賣股票的最好時機
題⽬描述
假設你有⼀個數組 prices ,⻓度為 n ,其中 prices[i] 是股票在第 i 天的價格,請根據這個價格數組,返回買賣股票能獲得的最⼤收益
你可以買⼊⼀次股票和賣出⼀次股票,並⾮每天都可以買⼊或賣出⼀次,總共只能買⼊和賣出⼀次,且買⼊必須在賣出的前⾯的某⼀天
如果不能獲取到任何利潤,請返回 0
假設買⼊賣出均⽆⼿續費
示例1:
輸⼊:[8,9,2,5,4,7,1
後端
Feb 10 2026
sevencoding -
劍指offer-74、n個骰⼦的點數
題目描述
把 n 個骰⼦扔在地上,所有骰⼦朝上⼀⾯的點數之和為 s 。輸⼊ n ,打印出 s 的所有可能的值出現的概率。
你需要⽤⼀個浮點數數組返回答案,其中第 i 個元素代表這 n 個骰⼦所能擲出的點數集合中第 i ⼩的那個的概率。
示例1:
輸⼊: 1
輸出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]
示例2
輸⼊: 2
輸
後端
Feb 09 2026
sevencoding -
AQS深度探索:以ReentrantLock看Java併發編程的高效實現
概述
AQS ( Abstract Queued Synchronizer )是一個抽象的隊列同步器,通過維護一個共享資源狀態( Volatile Int State )來表示同步狀態 和一個先進先出( FIFO )的線程等待隊列來完成資源獲取的排隊工作,通過CAS完成對State值的修改。
AQS整體框架如下:
當有自定義同步器接入時,只需重寫第一層所需要的部分方法即可,不需要關注底層具體的
後端
Feb 05 2026
sevencoding -
劍指offer-73、連續⼦數組的最⼤和(⼆)
題⽬描述
輸⼊⼀個⻓度為n 的整型數組array ,數組中的⼀個或連續多個整數組成⼀個⼦數組,找到⼀個具有
最⼤和的連續⼦數組。
⼦數組是連續的,⽐如[1,3,5,7,9] 的⼦數組有[1,3] , [3,5,7] 等等,但是[1,3,7] 不是⼦數組
如果存在多個最⼤和的連續⼦數組,那麼返回其中⻓度最⻓的,該題數據保證這個最⻓的只存在⼀個
該題定義的⼦數組的最⼩⻓度為1 ,不存在為
後端
Feb 04 2026
sevencoding -
劍指offer-72、禮物的最⼤價值
題⽬描述
在⼀個m × n的棋盤的每⼀格都放有⼀個禮物,每個禮物都有⼀定的價值(價值⼤於 0)。你可以從棋盤的左上⻆開始拿格⼦⾥的禮物,並每次向右或者向下移動⼀格、直到到達棋盤的右下⻆。給定⼀個棋盤及其上⾯的禮物的價值,請計算你最多能拿到多少價值的禮物?
如輸⼊這樣的⼀個⼆維數組,
[
[1,3,1],
[1,5,1],
[4,2,1]
]
那麼路徑 1→3→5→2→1 可以拿到最多價值的禮物,
後端
Feb 03 2026
sevencoding -
劍指offer-71、剪繩子(進階版)
題⽬描述
給你⼀根⻓度為 n 的繩⼦,請把繩⼦剪成整數⻓的 m 段( m 、 n 都是整數, n 1 並且 m
1 , m = n ),每段繩⼦的⻓度記為 k[1] ,..., k[m] 。請問 k[1] * k[2] * ... * k[m] 可能的最⼤乘積是多少?例如,當繩⼦的⻓度是 8 時,我們把它剪成⻓度分別為 2 、3 、3 的三段,此時得到的最⼤乘積是 18 。
由於答案過⼤
後端
Feb 02 2026
sevencoding -
線程如何停止?線程之間如何協作?線程之間的異常如何處理?
線程停止
stop方法
stop 方法雖然可以停止線程,但它已經是不建議使用的廢棄方法了,這一點可以通過 Thread 類中的源碼發現,stop 源碼如下:
stop 方法是被 @Deprecated 修飾的不建議使用的過期方法,並且在註釋的第一句話就説明了 stop 方法為非安全的方法。
原因在於它在終止一個線程時會強制中斷線程的執行,不管run方法是否執行完了,並且還會釋放這個線程所持有的所
後端
Jan 30 2026
sevencoding -
BlockingQueue:阻塞操作與條件隊列的高效結合
BlockingQueue和BlockingDeque
BlockingQueue
BlockingQueue 通常用於一個線程生產對象,而另外一個線程消費這些對象的場景。下圖是對這個原理的闡述:
一個線程往裏邊放,另外一個線程從裏邊取的一個 BlockingQueue。
一個線程將會持續生產新對象並將其插入到隊列之中,直到隊列達到它所能容納的臨界點。也就是説,它是有限的。如果該阻塞隊列到達了其
後端