Java中String.split()的最詳細源碼解讀及註意事項

前言

博主針對字符串分割時出現的各種空字符串問題,進入String類的源碼看瞭一下,現作如下解讀及演示:

一、split(regex,limit)

首先是帶有兩個參數的split方法:

作用:

將以給定正則表達式(regex)的字符串分隔開來

  • 第一個參數是傳入字符類型的分隔符,如 “,” 等(可以是任何字符串)
  • 第二個參數傳入整型的limit,代表的是將此字符串分割成n部分(這裡的n就是limit).

返回值:

此方法返回的數組包含此字符串的每個子字符串,這些子字符串以匹配到的正則表達式(就是以輸入的第一個參數regex)作為結束,或由字符串的結尾作為結束。

註意事項:

  1. 數組中的子字符串按照它們在這個字符串中出現的順序排列。
  2. 如果輸入的regex不匹配字符串裡面的任何字符,那麼結果數組隻有一個元素,即這個字符串。(就是若字符串裡面沒有出現輸入的regex參數)
  3. 如果在字符串的開頭有一個正數的匹配(就是字符串開頭有>0個的regex分隔符),那麼在結果數組的開頭會包含一個空的前導子字符串.
public class test {
    public static void main(String[] args) {
        String str = ",,1,2,3,4"; // 註意這裡字符串開頭就匹配到瞭逗號
        String[] s = str.split(",",10);// 這裡先取10,後文介紹第二個參數
        for (String string : s) {
            System.out.println("子字符串"+string);
        }
        System.out.println(s.length);
    }

}

運行結果:

第一個逗號前面會有出現一個空的子字符串

limit參數控制應用模式的次數,因此會影響結果數組的長度。(這裡的意思就是limit的取值控制瞭結果數組的長度)

對以上解讀如下: (1) 如果limit輸入的是一個正數, 那麼該模式將最多應用limit – 1次(就是說隻會用輸入的regex去字符串裡面匹配limit-1次),數組的長度將不大於limit,並且數組的最後一個條目將包含最後一個匹配的分隔符之外的所有輸入(就是說他分隔的模式是從前逐個往後的).給個代碼便於大傢理解:

public class test {
    public static void main(String[] args) {
        String str = "1,2,3,4";
        String[] s = str.split(",",2);//這裡輸入limit為2,即分成2部分
        for (String string : s) {
            System.out.println("子字符串"+string);
        }
        System.out.println(s.length);
    }

}

運行結果:

字符串被分隔成2個子字符串,分隔模式是從前往後的

(2) 如果輸入的limit為,則模式將被應用盡可能多的次數,結果數組可以有任何長度,而尾部的空字符串將被丟棄. (就是匹配字符串裡面所有的regex分隔符),關於空字符串被丟棄,代碼如下:

public class test {
    public static void main(String[] args) {
        String str = "1,2,3,4,,,";// 這裡後面逗號之間的空字符串將被丟棄
        String[] s = str.split(",",0);
        for (String string : s) {
            System.out.println("子字符串"+string);
        }
        System.out.println(s.length);
    }

}

運行結果:

尾部的空字符串將不會出現在結果數組裡

(3) 如果輸入limit的值為負數,則模式將被應用盡可能多的次數,數組可以有任何長度。(尾部的空字符串也不會被丟失噢)

public class test {
    public static void main(String[] args) {
        String str = ",1,2,3,4,";
        String[] s = str.split(",",-1);//limit值為負數
        for (String string : s) {
            System.out.println("子字符串"+string);
        }
        System.out.println(s.length);
    }

}

運行結果:

字符串的尾部空字符串不會被丟失

二、split(regex)

接下來隻帶有一個參數的split方法就容易瞭,就是默認limit的值為0.

該方法的工作原理就是用給定regex參數和一個limit參數默認為0來調用兩個參數的split方法。因此,結果數組中不包含尾隨的空字符串。

總結

到此這篇關於Java中String.split()的最詳細源碼解讀及註意事項的文章就介紹到這瞭,更多相關java String.split()源碼解讀內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: