亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java1.8中StringJoiner的使用及源碼詳析

 更新時(shí)間:2018年08月09日 08:38:51   作者:GoldArowana  
在看String類時(shí),看到有使用StringJoiner類,所以順便看了下StringJoiner類,下面這篇文章主要給大家介紹了關(guān)于Java 1.8中StringJoiner的使用及源碼分析的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧

前言

StringJoiner是Java里1.8新增的類,主要是幫助我們把一個(gè)列表拼接字符串, 或許有一部分人沒(méi)有接觸過(guò). 所以本文將從使用例子入手, 分析StringJoiner的源碼.

基本好的同學(xué), 其實(shí)只要把這段例子自己運(yùn)行一下, 自己看看源碼就可以了.因?yàn)槲矣X(jué)得這個(gè)類挺簡(jiǎn)單的. 沒(méi)必要看我下面的廢話....

public class StringJoinerTest {
 public static void main(String[] args) {
 StringJoiner joiner = new StringJoiner("--", "[[[_", "_]]]");
 System.out.println("toString: " + joiner.toString());
 System.out.println("length: " + joiner.length());
 
 System.out.println("******************(1)********************");
 
 joiner.add("1");
 joiner.add("2");
 joiner.add("3");
 joiner.add("4");
 System.out.println("toString: " + joiner.toString());
 System.out.println("length: " + joiner.length());
 
 System.out.println("******************(2)********************");
 
 StringJoiner joiner2 = new StringJoiner("...");
 System.out.println("toString: " + joiner2.toString());
 System.out.println("length: " + joiner2.length());
 
 System.out.println("******************(3)********************");
 
 joiner2.add("a");
 joiner2.add("b");
 joiner2.add("c");
 System.out.println("toString: " + joiner2.toString());
 System.out.println("length: " + joiner2.length());
 
 System.out.println("******************(4)********************");
 
 joiner.merge(joiner2);
 System.out.println("toString: " + joiner.toString());
 
 System.out.println("******************(5)********************");
 
 StringJoiner joiner3 = new StringJoiner("==", "qianzhui", "houzhui");
 joiner3.add("壹");
 joiner3.add("貳");
 joiner3.add("叁");
 
 joiner.merge(joiner3);
 System.out.println("toString: " + joiner.toString());
 System.out.println("length: " + joiner.length());
 
 System.out.println("******************(6)********************");
 joiner.merge(joiner); // joiner.merge(this)
 System.out.println("toString: " + joiner.toString());
 System.out.println("length: " + joiner.length());
 }
}

輸出結(jié)果如下:

toString: [[[__]]]
length: 8
******************(1)********************
toString: [[[_1--2--3--4_]]]
length: 18
******************(2)********************
toString:
length: 0
******************(3)********************
toString: a...b...c
length: 9
******************(4)********************
toString: [[[_1--2--3--4--a...b...c_]]]
******************(5)********************
toString: [[[_1--2--3--4--a...b...c--壹==貳==叁_]]]
length: 38
******************(6)********************
toString: [[[_1--2--3--4--a...b...c--壹==貳==叁--1--2--3--4--a...b...c--壹==貳==叁_]]]
length: 70

上面的例子看懂的同學(xué), 其實(shí)沒(méi)必要往下看下去了....下面的幾個(gè)例子就當(dāng)是我自己做了個(gè)總結(jié)吧.

例1

public class StringJoinerTest2 {
 public static void main(String[] args) {
 StringJoiner joiner = new StringJoiner("--", "[[[_ ", "_]]]");
 System.out.println(joiner.toString());
 System.out.println(joiner.length());
 }
}

輸出結(jié)果如下:

這個(gè)構(gòu)造器要傳入三個(gè)參數(shù). 第一個(gè)是`分隔符` , 第二個(gè)是`前綴` , 第三個(gè)是 `后綴`. 現(xiàn)在不明白也沒(méi)有關(guān)系, 下面待會(huì)兒會(huì)詳細(xì)介紹.

咱們先把這個(gè)構(gòu)造器對(duì)應(yīng)的源碼看了吧:

先是判斷非空. 然后就開(kāi)始賦值了. emptyValue被賦值為了prefix+suffix . 這段代碼就是這么簡(jiǎn)單... 其中:

1. prefix 是前綴. (待會(huì)兒再講)

2. delimiter 是分隔符 (待會(huì)兒再講)

3. suffix 是后綴 (待會(huì)兒再講)

4. emptyValue是本類的`空值`. 空值準(zhǔn)確來(lái)說(shuō)應(yīng)該是null, 但StringJoiner類把emptyValue來(lái)當(dāng)空值來(lái)處理. (馬上就講)

構(gòu)造器看完了, 咱們?cè)倏纯磘oString方法:

因?yàn)槟壳暗拇a里, 沒(méi)有對(duì)value進(jìn)行過(guò)賦值操作, 所以value肯定是null. 所以會(huì)執(zhí)行第一個(gè)if.

也就是說(shuō)真正的值value為空的時(shí)候, 就會(huì)返回本類默認(rèn)的空值emptyValue. (大家有沒(méi)有現(xiàn)在應(yīng)該知道emptyValue的作用了吧)

toString就先分析這一小段if, 剩下的后面再講. 接下來(lái)咱們看看length()方法:

value非空的時(shí)候, 長(zhǎng)度就是value的長(zhǎng)度+后綴的長(zhǎng)度.(前綴呢? 前綴去哪兒了? 為什么不單獨(dú)再加上前綴的長(zhǎng)度呢? 帶著這個(gè)疑惑往下看) .

value為空的時(shí)候, 長(zhǎng)度就是emptyValue的長(zhǎng)度.

例2

咱們往StringJoiner添加"1"

public class StringJoinerTest2 {
 public static void main(String[] args) {
 StringJoiner joiner = new StringJoiner("--", "[[[_", "_]]]");
 joiner.add("1");
 System.out.println("toString: " + joiner.toString());
 System.out.println("length: " + joiner.length());
 }
}

輸出結(jié)果如下:

這個(gè)時(shí)候, 或許大家對(duì)`前綴` `后綴` 有些理解了吧. (還沒(méi)理解也無(wú)所謂, 往下看)

咱們看看add方法的源碼吧:

通過(guò)append方法, 將咱們傳入的"1"添加到了末尾. 那么prepareBuilder()方法返回的是什么呢?看看源碼吧:

咱們調(diào)用add("1")的時(shí)候, value為空. 所以會(huì)執(zhí)行else語(yǔ)句. 在這里新實(shí)例化了一個(gè)StringBuilder. 然后StringBuilder先追加了`前綴`. (if語(yǔ)句先不講, 等執(zhí)行到了再講)

所以此時(shí)prepareBuilder方法返回的value實(shí)際上就是前綴: "[[[_"

回到add方法, 剛才咱們說(shuō)了add方法即時(shí)在prepareBuilder返回的值后面追加了"1"而已.

所以執(zhí)行完add方法之后, value就等于 "[[[_1" 所以value里就已經(jīng)包含了前綴了. 所以length方法里"為什么不單獨(dú)再計(jì)算前綴的長(zhǎng)度呢?" 因?yàn)関alue里面就已經(jīng)包含前綴了.

咱們?cè)倏纯磘oString方法:

這次value非空. 所以執(zhí)行這里else語(yǔ)句:

如果suffix等于空字符串, 那么就返回value.

如果suffix不等于空字符串, 那么就返回value+后綴.

再看看length()方法:

value不為空, 所以返回的值是 value的長(zhǎng)度+后綴的長(zhǎng)度.

例3

public class StringJoinerTest2 {
 public static void main(String[] args) {
  StringJoiner joiner = new StringJoiner("--", "[[[_", "_]]]");
  joiner.add("1");
  joiner.add("2");
  joiner.add("3");
  joiner.add("4");
  System.out.println("toString: " + joiner.toString());
  System.out.println("length: " + joiner.length());
 }
}

輸出結(jié)果如下:

add("1")和上一小節(jié)的執(zhí)行流程一樣. 這回看看add("2");的執(zhí)行流程吧:

由于前面add("1")執(zhí)行完了, 所以導(dǎo)致value已經(jīng)不是null了. 所以這里會(huì)執(zhí)行prepareBuilder方法里的if語(yǔ)句. 在value后直接追加一個(gè)delimiter分隔符. 然后返回這個(gè)value.

然后再add方法里, 把"2"追加到value后面.

例4

咱們發(fā)現(xiàn)add方法最后返回的是this.所以上面一小節(jié)的示例代碼可以寫成這樣:

public class StringJoinerTest2 {
 public static void main(String[] args) {
  StringJoiner joiner = new StringJoiner("--", "[[[_", "_]]]");
  joiner.add("1").add("2").add("3").add("4");
  System.out.println("toString: " + joiner.toString());
  System.out.println("length: " + joiner.length());
 }
}

例5

StringJoiner還有一個(gè)構(gòu)造器, 只需傳入分隔符:

public class StringJoinerTest2 {
 public static void main(String[] args) {
  StringJoiner joiner2 = new StringJoiner("...");
  System.out.println("toString: " + joiner2.toString());
  System.out.println("length: " + joiner2.length());
  System.out.println("**************************************");
  joiner2.add("a");
  joiner2.add("b");
  joiner2.add("c");
  System.out.println("toString: " + joiner2.toString());
  System.out.println("length: " + joiner2.length());
 }
}

輸出結(jié)果如下:

構(gòu)造器源碼如下:

就是只指定了分割符, 把前綴和后綴都指定為了空字符串.

例6

接下來(lái)咱們看看merge方法

public class StringJoinerTest2 {
 public static void main(String[] args) {
  StringJoiner joiner = new StringJoiner("--", "[[[_", "_]]]");
  joiner.add("1").add("2").add("3").add("4");
 
  StringJoiner joiner2 = new StringJoiner("...");
  joiner2.add("a").add("b").add("c");
 
  joiner.merge(joiner2);
  System.out.println(joiner.toString());
 }
}

輸出結(jié)果如下:

merge的源代碼如下:

咱們看到了用append方法進(jìn)行了字符串追加. (append的時(shí)候刨除去了other.value 的前綴).

總結(jié)

1. prepareBuilder方法在value為空的時(shí)候, 給value加上前綴.

2. prepareBuilder方法在value非空的時(shí)候, 給value加上分隔符.

3. 很多方法都不能傳入null為參數(shù). 因?yàn)橛肙bjects.requireNonNul方法限定了.

4. 前綴是包含在value里的. 而后綴部分是toString的時(shí)候才會(huì)被臨時(shí)添加到value里.

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 詳解Java類動(dòng)態(tài)加載和熱替換

    詳解Java類動(dòng)態(tài)加載和熱替換

    本文主要介紹類加載器、自定義類加載器及類的加載和卸載等內(nèi)容,并舉例介紹了Java類的熱替換。
    2021-05-05
  • Spring中@Async用法詳解及簡(jiǎn)單實(shí)例

    Spring中@Async用法詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了Spring中@Async用法詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Redis如何實(shí)現(xiàn)分布式鎖詳解

    Redis如何實(shí)現(xiàn)分布式鎖詳解

    分布式鎖一般有三種實(shí)現(xiàn)方式:1. 數(shù)據(jù)庫(kù)樂(lè)觀鎖;2. 基于Redis的分布式鎖;3. 基于ZooKeeper的分布式鎖.本篇文章將介紹第二種方式,基于Redis實(shí)現(xiàn)分布式鎖,文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06
  • 基于Security實(shí)現(xiàn)OIDC單點(diǎn)登錄的詳細(xì)流程

    基于Security實(shí)現(xiàn)OIDC單點(diǎn)登錄的詳細(xì)流程

    本文主要是給大家介紹 OIDC 的核心概念以及如何通過(guò)對(duì) Spring Security 的授權(quán)碼模式進(jìn)行擴(kuò)展來(lái)實(shí)現(xiàn) OIDC 的單點(diǎn)登錄。對(duì)Security實(shí)現(xiàn)OIDC單點(diǎn)登錄的詳細(xì)過(guò)程感興趣的朋友,一起看看吧
    2021-09-09
  • 一文帶你玩轉(zhuǎn)Java異常處理

    一文帶你玩轉(zhuǎn)Java異常處理

    這篇文章主要為大家介紹一下Java中的異常處理機(jī)制,文中通過(guò)示例為大家進(jìn)行了詳細(xì)的介紹,對(duì)我們學(xué)習(xí)有一定的幫助,感興趣的可以了解一下
    2022-08-08
  • java調(diào)用opencv身份證號(hào)識(shí)別詳解

    java調(diào)用opencv身份證號(hào)識(shí)別詳解

    這篇文章主要為大家詳細(xì)介紹了java如何調(diào)用opencv實(shí)現(xiàn)身份證號(hào)的識(shí)別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 新版idea如何開(kāi)啟多臺(tái)JVM虛擬機(jī)的流程步驟

    新版idea如何開(kāi)啟多臺(tái)JVM虛擬機(jī)的流程步驟

    在IntelliJ?IDEA這個(gè)集成開(kāi)發(fā)環(huán)境中(IDE),開(kāi)啟JVM(Java?Virtual?Machine)通常是在運(yùn)行Java應(yīng)用程序時(shí)的操作,本文給大家介紹了新版idea如何開(kāi)啟多臺(tái)JVM虛擬機(jī)的流程步驟,需要的朋友可以參考下
    2024-10-10
  • Spring動(dòng)態(tài)加載bean后調(diào)用實(shí)現(xiàn)方法解析

    Spring動(dòng)態(tài)加載bean后調(diào)用實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Spring動(dòng)態(tài)加載bean后調(diào)用實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Spring?Boot?快速使用?HikariCP?連接池配置詳解

    Spring?Boot?快速使用?HikariCP?連接池配置詳解

    Spring Boot 2.x 將其作為默認(rèn)的連接池組件,項(xiàng)目中添加 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 模塊后,HikariCP 依賴會(huì)被自動(dòng)引入,這篇文章主要介紹了Spring?Boot使用HikariCP連接池配置詳解,需要的朋友可以參考下
    2023-06-06
  • SpringBoot最常用的50個(gè)注解總結(jié)(全是干貨!)

    SpringBoot最常用的50個(gè)注解總結(jié)(全是干貨!)

    SpringBoot提供多種注解簡(jiǎn)化配置與啟動(dòng)流程,如@SpringBootAppication、@RestController、@RequestMapping等,這篇文章主要介紹了SpringBoot最常用的50個(gè)注解的相關(guān)資料,需要的朋友可以參考下
    2024-09-09

最新評(píng)論