<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java 中拼接 String 的 N 種方式

          共 3353字,需瀏覽 7分鐘

           ·

          2022-02-17 19:18


          1. 前言

          Java 提供了拼接 String 字符串的多種方式,不過有時(shí)候如果我們不注意 null 字符串的話,可能會(huì)把 null 拼接到結(jié)果當(dāng)中,很明顯這不是我們想要的。

          在這篇文章中,將介紹一些在拼接 String 時(shí)避免 null 值的幾種方式。

          2. 問題復(fù)現(xiàn)

          如果我們想要拼接 String 數(shù)組,可以簡單的使用 + 運(yùn)算符進(jìn)行拼接,但是可能會(huì)遇到 null 值。

          String[]?values?=?{"https",?"://",?"www.",?"wdbyte",?".com",?null};
          String?result?=?"";

          for?(String?value?:?values)?{
          ????result?=?result?+?value;
          }

          這會(huì)將所有元素拼接到結(jié)果字符串中,如下所示:

          https://www.wdbyte.comnull

          但是,我們已經(jīng)發(fā)現(xiàn)問題了,最后的 null 值作為字符串也拼接了下來,這顯然不是我們想要的。

          同樣,即使我們?cè)?Java 8 或更高版本上運(yùn)行,然后使用String.join() 靜態(tài)方法拼接字符串,一樣會(huì)得到帶有 null 值的輸出。

          String[]?values?=?{"https",?"://",?"www.",?"wdbyte",?".com",?null};
          String?result?=?String.join("",?values);
          //?output:?https://www.wdbyte.comnull

          下面看看一些可以避免 null 值被拼接下來的方法,我的期待的輸出結(jié)果應(yīng)該是:

          https://www.wdbyte.com

          3. 使用 + 運(yùn)算符

          加法符號(hào) + 可以拼接 String 字符串,那么我們只需要在拼接時(shí)進(jìn)行 null 判斷就可以把 null 值替換為空字符串了。

          for?(String?value?:?values)?{
          ??result?=?result?+?(value?==?null???""?:?value);
          }

          然而,我們知道 String 是一個(gè)不可變對(duì)象,使用 + 號(hào)會(huì)頻繁的創(chuàng)建字符串對(duì)象,每次都會(huì)在內(nèi)存中創(chuàng)建一個(gè)新的字符串,所以使用 + 符號(hào)來拼接字符串的性能消耗是很高的。

          為了方便后續(xù)的代碼演示,我們抽取一個(gè)可以傳入字符串,返回一個(gè)非 null 字符串的方法。

          public?String?nullToString(String?value)?{
          ????return?value?==?null???""?:?value;
          }

          因此上面的代碼可以改為調(diào)用這個(gè)方法:

          for?(String?value?:?values)?{
          ????result?=?result?+?nullToString(value);
          }

          4. 使用 String.concat()

          String.concat() 是 String 類自帶的一個(gè)方法,使用這種方式拼接字符串十分方便。

          for?(String?value?:?values)?{
          ????result?=?result.concat(getNonNullString(value));
          }

          因?yàn)檎{(diào)用了 nullToString() 方法,因此得到的結(jié)果中沒有 null 值。

          5. 使用 StringBuilder

          StringBuilder 類提供了很多有用且方便的 String 構(gòu)建方法。其中比較常用的是 append() 方法,使用 append() 來拼接字符串,同時(shí)結(jié)合 nullToString() 方法來避免 null 值。

          String[]?values?=?{"https",?"://",?"www.",?"wdbyte",?".com",?null};
          StringBuilder?result?=?new?StringBuilder();
          for?(String?value?:?values)?{
          ????result?=?result.append(nullToString(value));
          }

          可以得到如下結(jié)果:

          https://www.wdbyte.com

          6. 使用 StringJoiner 類 (Java 8+)

          StringJoiner 類提供了更強(qiáng)大的字符串拼接功能,不僅可以指定拼接時(shí)的分隔符,還可以指定拼接時(shí)的前綴和后綴,這里我們可以使用它的 add()方法來拼接字符串。

          同樣的會(huì)用 nullToString() 方法來避免 null 值。

          String[]?values?=?{"https",?"://",?"www.",?"wdbyte",?".com",?null};
          StringJoiner?result?=?new?StringJoiner("");
          for?(String?value?:?values)?{
          ????result?=?result.add(nullToString(value));
          }

          7. 使用 Streams.filter (Java 8+)

          Stream API 是 Java 8 引入的功能強(qiáng)大的流式操作類,可以進(jìn)行常見的過濾、映射、遍歷、分組、統(tǒng)計(jì)等操作。其中的過濾操作 filter 可以接收一個(gè) Predicate 函數(shù),Predicate 函數(shù)接口同之前介紹的 Function (opens new window)接口一樣,是一個(gè)函數(shù)式接口,它可以接受一個(gè)泛型 參數(shù),返回值為布爾類型,Predicate 常用于數(shù)據(jù)過濾。

          因此,我們可以定義一個(gè)Predicate 來檢查為 null 的字符串,然后傳遞給 Stream API 的 filter() 方法。

          最后再使用 Collectors.joining() 方法拼接剩余的非 null 字符串。

          String[]?values?=?{"https",?"://",?"www.",?"wdbyte",?".com",?null};
          String?result?=?Arrays.stream(values)
          ????.filter(Objects::nonNull)
          ????.collect(Collectors.joining());

          8. 總結(jié)

          這篇文章介紹了拼接非 null 字符串的幾種方式,不同的方式可能適合不同的場景,不過要注意拼接String 字符串是一項(xiàng)昂貴的操作,下面是使用 JMH 對(duì)幾種拼接方式進(jìn)行基準(zhǔn)測試的結(jié)果。

          Benchmark???????????????????Mode???Cnt???????Score????????Error??Units
          StringConcat.operateAdd?????thrpt???25??13635005.992?±?549759.774??ops/s
          StringConcat.String.concat??thrpt???25???7465193.417?±?667928.552??ops/s
          StringConcat.StringBuilder??thrpt???25??13949781.608?±?142001.421??ops/s
          StringConcat.StringJoiner???thrpt???25???9502405.473?±?211977.433??ops/s
          StringConcat.StreamFilter???thrpt???25???8998396.107?±?649033.722??ops/s

          可以看到 StringBuilder 的性能是最好的,實(shí)際使用時(shí)要結(jié)合具體場景,然后選擇最低的性能開銷方式。

          一如既往,文章中的代碼存放在:github.com/niumoo/JavaNotes

          ---- END ----

          Hello world : )?這篇文章就到這里了,我是阿朗,點(diǎn)贊和在看,動(dòng)力無限,求關(guān)注

          點(diǎn)個(gè)在看,加油充電~??

          瀏覽 76
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色婷婷精品国产一区二区 | 欧美乱码人妻蜜桃视频 | 情趣网站在线看。91 | AV观看在线观看 | Gg视频 亚洲一区 |