Java中常見字符串拼接方式

[TOC]

方式一:+ 最常見的方式

        String aa = "今天";
        String bb = "明天";
        System.out.println(aa+bb);

方式二:StringBuilder.append()和StringBuffer.append()

先有StringBuffer后有StringBuilder,兩者就像是孿生雙胞胎,該有的都有间护,只不過大哥StringBuffer,大部分方法都經(jīng)過synchronized修飾李皇,所以StringBuffer是線程安全的扰才,但是它效率就相對StringBuilder較低

        String aa = "今天";
        String bb = "明天";
        StringBuilder sber = new StringBuilder();
        StringBuffer sbf = new StringBuffer();
        sber.append(aa).append(bb);
        System.out.println(sber.toString());
        sbf.append(aa).append(bb);
        System.out.println(sbf.toString());

方式三:String類下的cocat()方法

如果拼接的字符串是null,concat會拋出NullPointerException汽馋。如果拼接的字符串是一個空字符串(“”)明场,那么concat的效率要更高汽摹。如果拼接的字符串非常多,concat的效率就會下降苦锨,因為創(chuàng)建的字符串對象越多逼泣,開銷越大。

        String aa = "今天";
        String bb = "明天";
        String concat = aa.concat(bb);
        System.out.println(concat);

方式四:String類下的join()方法

JDK1.8提供了一種新的字符串拼接姿勢:String類增加了一個靜態(tài)方法join舟舒,第一個參數(shù)為字符串連接符

        String aa = "今天";
        String bb = "明天";
        String join = String.join("-", aa, bb);
        System.out.println(join);

方式五:StringJoiner

StringJoiner是JDK1.8拉庶,java.util包中的一個類,用于構(gòu)造一個由分隔符重新連接的字符序列

        String aa = "今天";
        String bb = "明天";
        StringJoiner sj = new StringJoiner(":", "[", "]");
        sj.add(aa).add(bb);
        System.out.println(sj.toString());

StringJoiner源碼

package java.util;

public final class StringJoiner {
    private final String prefix;//前綴
    private final String delimiter;//間隔符
    private final String suffix;//后綴
    private StringBuilder value;//值

    private String emptyValue;//空值

    public StringJoiner(CharSequence delimiter) {
        this(delimiter, "", "");//默認前綴和后綴為"",重載調(diào)用
    }

    public StringJoiner(CharSequence delimiter,
                        CharSequence prefix,
                        CharSequence suffix) {
        //間隔符秃励,前綴和后綴判斷是否為null氏仗,null將拋出異常
        Objects.requireNonNull(prefix, "The prefix must not be null");
        Objects.requireNonNull(delimiter, "The delimiter must not be null");
        Objects.requireNonNull(suffix, "The suffix must not be null"); 
        // 成員變量賦值
        this.prefix = prefix.toString();
        this.delimiter = delimiter.toString();
        this.suffix = suffix.toString();
        this.emptyValue = this.prefix + this.suffix;//空值被設(shè)置為只有前后綴
    }
    //設(shè)置空值,檢查是否為null
    public StringJoiner setEmptyValue(CharSequence emptyValue) {
        this.emptyValue = Objects.requireNonNull(emptyValue,
            "The empty value must not be null").toString();
        return this;
    }

    @Override
    public String toString() {
        if (value == null) {
            return emptyValue;//沒有值將返回空值或者后續(xù)設(shè)置的空值
        } else {
            if (suffix.equals("")) {
                return value.toString();//后綴為""直接返回字符串,不用添加
            } else {
                //后綴不為""皆尔,添加后綴呐舔,然后直接返回字符串,修改長度
                int initialLength = value.length();
                String result = value.append(suffix).toString();
                // reset value to pre-append initialLength
                value.setLength(initialLength);
                return result;
            }
        }
    }
    初始化慷蠕,先添加前綴珊拼,有了之后每次先添加間隔符,StringBuilder后續(xù)append字符串
    public StringJoiner add(CharSequence newElement) {
        prepareBuilder().append(newElement);
        return this;
    }
    //合并StringJoiner流炕,注意后面StringJoiner 的前綴就不要了澎现,后面的appen進來
    public StringJoiner merge(StringJoiner other) {
        Objects.requireNonNull(other);
        if (other.value != null) {
            final int length = other.value.length();
            // lock the length so that we can seize the data to be appended
            // before initiate copying to avoid interference, especially when
            // merge 'this'
            StringBuilder builder = prepareBuilder();
            builder.append(other.value, other.prefix.length(), length);
        }
        return this;
    }
    //初始化,先添加前綴每辟,有了之后每次先添加間隔符
    private StringBuilder prepareBuilder() {
        if (value != null) {
            value.append(delimiter);
        } else {
            value = new StringBuilder().append(prefix);
        }
        return value;
    }

    public int length() {
        // Remember that we never actually append the suffix unless we return
        // the full (present) value or some sub-string or length of it, so that
        // we can add on more if we need to.
        //不忘添加后綴的長度
        return (value != null ? value.length() + suffix.length() :
                emptyValue.length());
    }
}

方式六:StringUtils.join()

實戰(zhàn)項目中剑辫,我們處理字符串的時候,經(jīng)常會用到這個類.org.apache.commons.lang3.StringUtils包下渠欺,該方法更善于拼接數(shù)組中的字符串妹蔽,并且不用擔心 NullPointerException。

        String aa = "今天";
        String bb = "明天";
        String ids[] = {"1","2","3"};
        System.out.println(StringUtils.join(aa,bb,"-","124"));
        String join1 = StringUtils.join(ids,",");
        System.out.println(join1);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挠将,一起剝皮案震驚了整個濱河市讹开,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捐名,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闹击,死亡現(xiàn)場離奇詭異镶蹋,居然都是意外死亡,警方通過查閱死者的電腦和手機赏半,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門贺归,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人断箫,你說我怎么就攤上這事拂酣。” “怎么了仲义?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵婶熬,是天一觀的道長。 經(jīng)常有香客問我埃撵,道長赵颅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任暂刘,我火速辦了婚禮饺谬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谣拣。我一直安慰自己募寨,他們只是感情好族展,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拔鹰,像睡著了一般仪缸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上格郁,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天腹殿,我揣著相機與錄音,去河邊找鬼例书。 笑死锣尉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的决采。 我是一名探鬼主播自沧,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼树瞭!你這毒婦竟也來了拇厢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤晒喷,失蹤者是張志新(化名)和其女友劉穎孝偎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凉敲,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡衣盾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了爷抓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片势决。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蓝撇,靈堂內(nèi)的尸體忽然破棺而出果复,到底是詐尸還是另有隱情,我是刑警寧澤渤昌,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布虽抄,位于F島的核電站,受9級特大地震影響独柑,放射性物質(zhì)發(fā)生泄漏极颓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一群嗤、第九天 我趴在偏房一處隱蔽的房頂上張望菠隆。 院中可真熱鬧,春花似錦、人聲如沸骇径。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽破衔。三九已至清女,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晰筛,已是汗流浹背嫡丙。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留读第,地道東北人曙博。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像怜瞒,于是被迫代替她去往敵國和親父泳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

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