博客 / 列表

sevencoding - Java對象頭:深入理解對象存儲的核心機制

Java對象結構 實例化一個Java對象之後,該對象在內存中的結構是怎麼樣的?Java對象(Object實例)結構包括三部分:對象頭、對象體和對齊字節,具體下圖所示 Java對象的三部分 對象頭 對象頭包括三個字段,第一個字段叫作Mark Word(標記字),用於存儲自身運行時的數據,例如GC標誌位、哈希碼、鎖狀態等信息。 第二個字段叫作Class Pointer(類對象指針),用於存放方法區C

後端

sevencoding - 類字節碼:揭開Java虛擬機運行機制的神秘面紗

概述 計算機是不能直接運行java代碼的,必須要先運行java虛擬機,再由java虛擬機運行編譯後的java代碼。 因為在cpu層面看來計算機中所有的操作都是一個個指令的運行彙集而成的,java是高級語言,只有人類才能理解其邏輯,計算機是無法識別的,所以java代碼必須要先編譯成字節碼文件,jvm才能正確識別代碼轉換後的指令並將其運行。 Java代碼間接翻譯成字節碼,儲存字節碼的文件再交由運行於不

後端

sevencoding - 第一批被龍蝦氣到的人出現了

引言 我朋友,一個脾氣温和、情緒穩定的成年人,今天,在電腦前憋出了他今年第一句字正腔圓的國罵。 對象不是甲方,不是隊友,而是一個AI——確切説,是一個花了他不少錢、號稱能當“私人數字助理”的玩意兒,花名龍蝦。 事情得從頭説起。那天下午,他喜氣洋洋地跟我顯擺,説也養了個龍蝦,能自動整理AI資訊,能給它下發定時任務,讓它完成本該他完成的任務。“這下爽了,終於能躺着幹活了!” 最開始,它確實像個精英助

後端

sevencoding - NIO的零拷貝如何實現高效數據傳輸?

Java NIO零拷貝 在 Java NIO 中的通道(Channel)就相當於操作系統的內核空間(kernel space)的緩衝區,而緩衝區(Buffer)對應的相當於操作系統的用户空間(user space)中的用户緩衝區(user buffer)。 通道(Channel)是全雙工的(雙向傳輸),它既可能是讀緩衝區(read buffer),也可能是網絡緩衝區(socket buffer

後端

sevencoding - NIO:解開非阻塞I/O高併發編程的秘密

流與塊 Standard IO是對字節流的讀寫,在進行IO之前,首先創建一個流對象,流對象進行讀寫操作都是按字節 ,一個字節一個字節的來讀或寫。而NIO把IO抽象成塊,類似磁盤的讀寫,每次IO操作的單位都是一個塊,塊被讀入內存之後就是一個byte[],NIO一次可以讀或寫多個字節。 I/O 與 NIO 最重要的區別是數據打包和傳輸的方式,I/O 以流的方式處理數據,而 NIO 以塊的方式處理數據。

後端

sevencoding - 劍指offer-81、⼆叉搜索樹的最近公共祖先

題⽬描述 給定⼀個⼆叉搜索樹, 找到該樹中兩個指定節點的最近公共祖先。 對於該題的最近的公共祖先定義:對於有根樹T的兩個結點p 、q ,最近公共祖先LCA(T,p,q)表示⼀個結點x ,滿⾜x 是p 和q 的祖先且x 的深度儘可能⼤。在這⾥,⼀個節點也可以是它⾃⼰的祖先. ⼆叉搜索樹是若它的左⼦樹不空,則左⼦樹上所有結點的值均⼩於它的根結點的值; 若它的右⼦樹不空,則右⼦樹上所有結點的值均⼤

後端

sevencoding - BIO詳解:解鎖阻塞IO的使用方式

關於同步/異步,阻塞/非阻塞,Unix IO模型,可以先看這篇文章網絡系統 - Unix IO模型 BIO概述 阻塞式IO。也就是説io沒有就緒的時候,操作IO當前線程會被阻塞。也就是用户線程需要等待IO線程完成 服務器實現模式為一個連接一個線程,也就是説,客户端每當有一個連接請求的時候,服務器就需要啓動一個對應線程進行處理。但是如果這個連接不做任何事情,就會造成不必要的線程開銷。這種模型一般適用

後端

sevencoding - 劍指offer-80、⼆叉樹中和為某⼀值的路徑(二)

題⽬描述 給定⼀個⼆叉樹root和⼀個整數值 sum ,求該樹有多少路徑的的節點值之和等於 sum 。 該題路徑定義不需要從根節點開始,也不需要在葉⼦節點結束,但是⼀定是從⽗親節點往下到孩⼦節點 總節點數⽬為 n 保證最後返回的路徑個數在整形範圍內 假如⼆叉樹 root 為 {1,2,3,4,5,4,3,#,#,-1} , sum=6 ,那麼總共如下所示, 思路及解答 雙重遞歸法(暴力

後端

sevencoding - 劍指offer-79、最⻓不含重複字符的⼦字符串

題目描述 請從字符串中找出⼀個最⻓的不包含重複字符的⼦字符串,計算該最⻓⼦字符串的⻓度。 數據範圍: ⻓度⼩於40000 示例1 輸⼊:"abcabcbb" 返回值:3 説明:因為⽆重複字符的最⻓⼦串是"abc",所以其⻓度為 3。 示例2 輸⼊:"bbbbb" 返回值:1 説明:因為⽆重複字符的最⻓⼦串是"b",所以其⻓度為 1 示例3 輸⼊:"pwwk

後端

sevencoding - 虛擬線程深度解析:輕量併發編程的未來趨勢

這是Java19新增的預覽版功能,到Java21正式可以使用 簡介 虛擬線程是一種用户態下的線程,類似go語言中的goroutines 和Erlang中的processes,虛擬線程並非比線程快,而是提高了應用的吞吐量,相比於傳統的線程是由操作系統調度來看,虛擬線程是我們自己程序調度的線程。如果你對之前java提供的線程API比較熟悉了,那麼在學習虛擬線程的時候會比較輕鬆,傳統線程能運行的代碼,虛

後端

sevencoding - Condition底層機制剖析:多線程等待與通知機制

概述 Condition 是一個多線程協調通信的工具類,可以讓某些線程一起等待某個條件(condition),只有滿足條件時,線程才會被喚醒。 在使用Lock之前,使用的最多的同步方式應該是synchronized關鍵字來實現同步方式了。配合Object的wait()、notify()系列方法可以實現等待/通知模式。 Condition接口也提供了類似Object的監視器方法

後端

sevencoding - 劍指offer-78、求平⽅根

題⽬描述 給定⼀個⾮負整數 x ,計算並返回 x 的平⽅根,即實現 int sqrt(int x) 函數。 正數的平⽅根有兩個,只輸出其中的正數平⽅根。如果平⽅根不是整數,輸出只保留整數的部分,⼩數部分將被捨去。 示例1 輸⼊:8 返回值:2 解釋:8 的平⽅根是 2.82842…,由於⼩數部分將被捨去,所以返回 2 思路及解答 暴力枚舉 從0開始遞增,找到最大的i滿足i² ≤

後端

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] 思路及解答 直接計算 不太清楚這道題是要考察什麼(苦笑),⼏乎都是⼀個循環能解決的事情,仔細想了⼀下,也並沒有想到其他⽐較

後端

sevencoding - CompletableFuture深度解析:異步編程與任務編排的實現

前言 CompletableFuture是jdk8的新特性。CompletableFuture的實現與使用上,處處體現出了函數式異步編程的味道。一個CompletableFuture對象可以被一個環節接一個環節的處理、也可以對兩個或者多個CompletableFuture進行組合處理或者等待結果完成。通過對CompletableFuture各種方法的合理使用與組合搭配,可以在很多的場景都可以應付自

後端

sevencoding - LockSupport深度解析:線程阻塞與喚醒的底層實現原理

LockSupport簡介 LockSupprot 用來阻塞和喚醒線程,底層實現依賴於Unsafe 類。 LockSupport用來創建鎖和其他同步類的基本線程阻塞原語。簡而言之,當調用LockSupport.park時,表示當前線程將會等待,直至獲得許可,當調用LockSupport.unpark時,必須把等待獲得許可的線程作為參數進行傳遞,好讓此線程繼續運行。在AQS中大量使用,AQS最終都是

後端

sevencoding - 劍指offer-76、刪除鏈表的節點

題⽬描述 給定單向鏈表的頭指針和⼀個要刪除的節點的值,定義⼀個函數刪除該節點。返回刪除後的鏈表的頭節點。 此題對⽐原題有改動 題⽬保證鏈表中節點的值互不相同 該題只會輸出返回的鏈表和結果做對⽐,所以若使⽤ C 或 C++ 語⾔,你不需要 free 或 delete 被刪除的節點 數據範圍: 0=鏈表節點值=10000 0=鏈表⻓度=10000 示例1 輸⼊:{2,5,1,9},5

後端

sevencoding - 劍指offer-75、買賣股票的最好時機

題⽬描述 假設你有⼀個數組 prices ,⻓度為 n ,其中 prices[i] 是股票在第 i 天的價格,請根據這個價格數組,返回買賣股票能獲得的最⼤收益 你可以買⼊⼀次股票和賣出⼀次股票,並⾮每天都可以買⼊或賣出⼀次,總共只能買⼊和賣出⼀次,且買⼊必須在賣出的前⾯的某⼀天 如果不能獲取到任何利潤,請返回 0 假設買⼊賣出均⽆⼿續費 示例1: 輸⼊:[8,9,2,5,4,7,1

後端

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 輸

後端

sevencoding - AQS深度探索:以ReentrantLock看Java併發編程的高效實現

概述 AQS ( Abstract Queued Synchronizer )是一個抽象的隊列同步器,通過維護一個共享資源狀態( Volatile Int State )來表示同步狀態 和一個先進先出( FIFO )的線程等待隊列來完成資源獲取的排隊工作,通過CAS完成對State值的修改。 AQS整體框架如下: 當有自定義同步器接入時,只需重寫第一層所需要的部分方法即可,不需要關注底層具體的

後端

sevencoding - 劍指offer-73、連續⼦數組的最⼤和(⼆)

題⽬描述 輸⼊⼀個⻓度為n 的整型數組array ,數組中的⼀個或連續多個整數組成⼀個⼦數組,找到⼀個具有 最⼤和的連續⼦數組。 ⼦數組是連續的,⽐如[1,3,5,7,9] 的⼦數組有[1,3] , [3,5,7] 等等,但是[1,3,7] 不是⼦數組 如果存在多個最⼤和的連續⼦數組,那麼返回其中⻓度最⻓的,該題數據保證這個最⻓的只存在⼀個 該題定義的⼦數組的最⼩⻓度為1 ,不存在為

後端

sevencoding - 劍指offer-72、禮物的最⼤價值

題⽬描述 在⼀個m × n的棋盤的每⼀格都放有⼀個禮物,每個禮物都有⼀定的價值(價值⼤於 0)。你可以從棋盤的左上⻆開始拿格⼦⾥的禮物,並每次向右或者向下移動⼀格、直到到達棋盤的右下⻆。給定⼀個棋盤及其上⾯的禮物的價值,請計算你最多能拿到多少價值的禮物? 如輸⼊這樣的⼀個⼆維數組, [ [1,3,1], [1,5,1], [4,2,1] ] 那麼路徑 1→3→5→2→1 可以拿到最多價值的禮物,

後端

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 。 由於答案過⼤

後端

sevencoding - 線程如何停止?線程之間如何協作?線程之間的異常如何處理?

線程停止 stop方法 stop 方法雖然可以停止線程,但它已經是不建議使用的廢棄方法了,這一點可以通過 Thread 類中的源碼發現,stop 源碼如下: stop 方法是被 @Deprecated 修飾的不建議使用的過期方法,並且在註釋的第一句話就説明了 stop 方法為非安全的方法。 原因在於它在終止一個線程時會強制中斷線程的執行,不管run方法是否執行完了,並且還會釋放這個線程所持有的所

後端

sevencoding - BlockingQueue:阻塞操作與條件隊列的高效結合

BlockingQueue和BlockingDeque BlockingQueue BlockingQueue 通常用於一個線程生產對象,而另外一個線程消費這些對象的場景。下圖是對這個原理的闡述: 一個線程往裏邊放,另外一個線程從裏邊取的一個 BlockingQueue。 一個線程將會持續生產新對象並將其插入到隊列之中,直到隊列達到它所能容納的臨界點。也就是説,它是有限的。如果該阻塞隊列到達了其

後端