Netty的ByteBuf和JDK的ByteBuffer的區(qū)別浪感?

1.Buffer

1.1 重要屬性

  • capacity:buffer中包含元素的個數(shù)赋秀。其值一旦確認(rèn)后不可更改。
  • limit:第一個不可被讀元素的索引值待榔。
  • position:下一個要被讀或者寫元素的索引值逞壁。

三個屬性之間的關(guān)系:0 <= mark <= position <= limit <= capacity 。

1.2 重要方法

clear
用來讓一個buffer的屬性回到特定值锐锣,相當(dāng)于達(dá)到了清空buffer中元素的效果腌闯。

    public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }

flip
在讀寫進行切換操作的時候使用。

    public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }

rewind
用來對buffer進行重讀雕憔。

    public final Buffer rewind() {
        position = 0;
        mark = -1;
        return this;
    }

2.ByteBuffer

ByteBuffer是Buffer的一個實現(xiàn)姿骏。

該類定義了6種byte buffers的操作方法:

  • 用來讀取/寫入的絕對/相對方法
  • 將緩沖區(qū)中的字節(jié)序列輸出到數(shù)組中
  • 將數(shù)組或者其他的buffer中的字節(jié)序列輸出到另一個buffer中
  • 與字符有關(guān)的操作
  • 創(chuàng)建buffer的方法
  • 壓縮、復(fù)制斤彼、劃分buffer

3.ByteBuf

ByteBuf的劃分

ByteBuf劃分

3.1 discardReadBytes方法

當(dāng)buffer中可寫空間不足時分瘦,可以調(diào)用該方法,通過將readerIndex設(shè)置為0琉苇,并將readable bytes區(qū)間的內(nèi)容移到buffer的開頭嘲玫,并將writeIndex設(shè)置為writeIndex-readerIndex,實現(xiàn)了清空已讀部分內(nèi)容的作用并扇。

    @Override
    public ByteBuf discardReadBytes() {
        ensureAccessible();
        if (readerIndex == 0) {
            return this;
        }

        if (readerIndex != writerIndex) {
            // 移動剩余未讀部分
            setBytes(0, this, readerIndex, writerIndex - readerIndex);
            // 重現(xiàn)調(diào)整Index值
            writerIndex -= readerIndex;
            adjustMarkers(readerIndex);
            readerIndex = 0;
        } else {
            adjustMarkers(readerIndex);
            writerIndex = readerIndex = 0;
        }
        return this;
    }

3.2 calculateNewCapacity方法

該方法用來重新計算buffer的capacity的值去团。

    @Override
    public int calculateNewCapacity(int minNewCapacity, int maxCapacity) {
        checkPositiveOrZero(minNewCapacity, "minNewCapacity");
      //當(dāng)已分配的空間大于最大可分配空間時直接拋出異常
        if (minNewCapacity > maxCapacity) {
            throw new IllegalArgumentException(String.format(
                    "minNewCapacity: %d (expected: not greater than maxCapacity(%d)",
                    minNewCapacity, maxCapacity));
        }
        final int threshold = CALCULATE_THRESHOLD; // 1048576 * 4

    
        if (minNewCapacity == threshold) {
            return threshold;
        }

        // If over threshold, do not double but just increase by threshold.
        if (minNewCapacity > threshold) {
            int newCapacity = minNewCapacity / threshold * threshold;
            if (newCapacity > maxCapacity - threshold) {
                newCapacity = maxCapacity;
            } else {
                newCapacity += threshold;
            }
            return newCapacity;
        }

        // Not over threshold. Double up to 4 MiB, starting from 64.
        int newCapacity = 64;
        while (newCapacity < minNewCapacity) {
            newCapacity <<= 1;
        }

        return Math.min(newCapacity, maxCapacity);
    }

擴容分為兩種:
1.當(dāng)capacity<=threshold時,通過2的指數(shù)獲取到新的capacity;
2.當(dāng)capacity>threshold時土陪,capacity每次加上一個threshold的值昼汗,知道到達(dá)maxCapacity。

4.最主要區(qū)別鬼雀?

  • ByteBuffer通過position和limit來控制讀取和寫入顷窒,每次切換讀寫時都需要調(diào)用flip方法,而ByteBuf通過writerIndex和readerIndex來簡化控制源哩。
  • ByteBuffer中的capacity是一個固定值蹋肮,ByteBuf可以調(diào)用calculateNewCapacity方法來重新計算capacity值。

以上都是我個人看完doc文檔的想法璧疗,如有不足之處坯辩,請各位大佬指出。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崩侠,一起剝皮案震驚了整個濱河市漆魔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌却音,老刑警劉巖改抡,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異系瓢,居然都是意外死亡阿纤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門夷陋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欠拾,“玉大人,你說我怎么就攤上這事骗绕∶暾” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵酬土,是天一觀的道長荆忍。 經(jīng)常有香客問我,道長撤缴,這世上最難降的妖魔是什么刹枉? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮屈呕,結(jié)果婚禮上微宝,老公的妹妹穿的比我還像新娘。我一直安慰自己凉袱,他們只是感情好芥吟,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布侦铜。 她就那樣靜靜地躺著专甩,像睡著了一般钟鸵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涤躲,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天棺耍,我揣著相機與錄音,去河邊找鬼种樱。 笑死蒙袍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嫩挤。 我是一名探鬼主播害幅,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼岂昭!你這毒婦竟也來了以现?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤约啊,失蹤者是張志新(化名)和其女友劉穎邑遏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恰矩,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡记盒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了外傅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纪吮。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖萎胰,靈堂內(nèi)的尸體忽然破棺而出彬碱,到底是詐尸還是另有隱情,我是刑警寧澤奥洼,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布巷疼,位于F島的核電站,受9級特大地震影響灵奖,放射性物質(zhì)發(fā)生泄漏嚼沿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一瓷患、第九天 我趴在偏房一處隱蔽的房頂上張望骡尽。 院中可真熱鬧,春花似錦擅编、人聲如沸攀细。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谭贪。三九已至境钟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間俭识,已是汗流浹背慨削。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留套媚,地道東北人缚态。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像堤瘤,于是被迫代替她去往敵國和親玫芦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容