Java源碼分析-String

對(duì)String類(lèi)的討論已經(jīng)是老生常談了,最權(quán)威的莫過(guò)于源碼谴餐,今天就來(lái)看下String源碼姻政。基于JDK1.8岂嗓。

支持原創(chuàng)汁展,轉(zhuǎn)載請(qǐng)注明出處。

繼承關(guān)系

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence

成員變量

private final char value[];    //private, final修飾確保不會(huì)被外界引用,且所有操作不會(huì)修改數(shù)組的值食绿,這是String常量性質(zhì)的保證
private int hash; // Default to 0

構(gòu)造方法

    public String() {
        this.value = new char[0];
    }

    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }

    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

    public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count < 0) {
            throw new StringIndexOutOfBoundsException(count);
        }
        // Note: offset or count might be near -1>>>1.
        if (offset > value.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }
        this.value = Arrays.copyOfRange(value, offset, offset+count);
    }

構(gòu)造函數(shù)都很直觀侈咕。

charAt方法

    public char charAt(int index) {
        if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value[index];
    }

很直觀,直接返回下標(biāo)對(duì)應(yīng)的字符器紧。

substring方法

    public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > value.length) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        int subLen = endIndex - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return ((beginIndex == 0) && (endIndex == value.length)) ? this
                : new String(value, beginIndex, subLen);  //創(chuàng)建一個(gè)新的String對(duì)象
    }

該方法耀销,首先檢查參數(shù)是否合法,若合法铲汪,則創(chuàng)建一個(gè)新的String對(duì)象熊尉,期間伴隨著拷貝操作。

replace方法

    public String replace(char oldChar, char newChar) {
        if (oldChar != newChar) {    //新老字符不相等直接方法當(dāng)前對(duì)象
            int len = value.length;
            int i = -1;
            char[] val = value; /* avoid getfield opcode */

            while (++i < len) {
                if (val[i] == oldChar) {   //尋找第一個(gè)oldChar
                    break;
                }
            }
            if (i < len) {           //存在oldChar
                char buf[] = new char[len];
                for (int j = 0; j < i; j++) { //原封不動(dòng)拷貝i之前的字符
                    buf[j] = val[j];
                }
                while (i < len) {
                    char c = val[i];
                    buf[i] = (c == oldChar) ? newChar : c; //用新字符替換舊字符
                    i++;
                }
                return new String(buf, true);  //創(chuàng)建新的字符串掌腰,并返回
            }
        }
        return this;
    }

該方法尋找第一個(gè)oldChar下標(biāo)i狰住,如果存在oldChar,則新建一個(gè)字符數(shù)組buf齿梁,拷貝i之前的字符到新字符數(shù)組催植,i之后用新字符替換舊字符。用buf新建String對(duì)象士飒,并返回查邢。

總結(jié)

String的常量性質(zhì)來(lái)源于private final char value[],并且所有操作中都不會(huì)直接修改value這個(gè)數(shù)組酵幕。

支持原創(chuàng)扰藕,轉(zhuǎn)載請(qǐng)注明出處。
github:https://github.com/gatsbydhn

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芳撒,一起剝皮案震驚了整個(gè)濱河市邓深,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笔刹,老刑警劉巖芥备,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異舌菜,居然都是意外死亡萌壳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)日月,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袱瓮,“玉大人,你說(shuō)我怎么就攤上這事爱咬〕呓瑁” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵精拟,是天一觀的道長(zhǎng)燎斩。 經(jīng)常有香客問(wèn)我虱歪,道長(zhǎng),這世上最難降的妖魔是什么栅表? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任笋鄙,我火速辦了婚禮,結(jié)果婚禮上怪瓶,老公的妹妹穿的比我還像新娘局装。我一直安慰自己,他們只是感情好劳殖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著拨脉,像睡著了一般哆姻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玫膀,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天矛缨,我揣著相機(jī)與錄音,去河邊找鬼帖旨。 笑死箕昭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的解阅。 我是一名探鬼主播落竹,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼货抄!你這毒婦竟也來(lái)了述召?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蟹地,失蹤者是張志新(化名)和其女友劉穎积暖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體怪与,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夺刑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了分别。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遍愿。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖茎杂,靈堂內(nèi)的尸體忽然破棺而出错览,到底是詐尸還是另有隱情,我是刑警寧澤煌往,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布倾哺,位于F島的核電站轧邪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏羞海。R本人自食惡果不足惜忌愚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望却邓。 院中可真熱鬧硕糊,春花似錦、人聲如沸腊徙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撬腾。三九已至螟蝙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間民傻,已是汗流浹背胰默。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漓踢,地道東北人牵署。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像喧半,于是被迫代替她去往敵國(guó)和親奴迅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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

  • Tip:筆者馬上畢業(yè)了挺据,準(zhǔn)備開(kāi)始 Java 的進(jìn)階學(xué)習(xí)計(jì)劃半沽。于是打算先從 String 類(lèi)的源碼分析入手,作為后面...
    石先閱讀 12,016評(píng)論 16 58
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法吴菠,類(lèi)相關(guān)的語(yǔ)法者填,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法做葵,異常的語(yǔ)法占哟,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,639評(píng)論 18 399
  • 一榨乎、基本數(shù)據(jù)類(lèi)型 注釋 單行注釋?zhuān)?/ 區(qū)域注釋?zhuān)?* */ 文檔注釋?zhuān)?** */ 數(shù)值 對(duì)于byte類(lèi)型而言...
    龍貓小爺閱讀 4,265評(píng)論 0 16
  • java筆記第一天 == 和 equals ==比較的比較的是兩個(gè)變量的值是否相等,對(duì)于引用型變量表示的是兩個(gè)變量...
    jmychou閱讀 1,501評(píng)論 0 3
  • 經(jīng)常在一些文藝的外國(guó)影片中會(huì)聽(tīng)到這樣的臺(tái)詞瘫筐,"XXX(人名)蜜暑,please, You are not an ...
    冬冬汪閱讀 461評(píng)論 0 2