1. 程式人生 > >分享一個 Java String split 快速分割的方法

分享一個 Java String split 快速分割的方法

均值 last turn ray 正則 bstr 結果 加鎖 out

java中string.split() 方法比較強大,但是split()方法采用正則表達式,速度相對會慢一點,

其實大多數場景下並不需要使用正則表達式,下面分享一個不使用正則表達式分隔字符串的方法。

方法保證了和 string.split()的輸出結果一致。

直接看代碼:

    public static String[] split(String src,String delimeter){
        String srcStr = src;
        String delimeterStr = delimeter;
        if(srcStr==null){
            
return null; } if(delimeterStr==null){ throw new IllegalArgumentException("delimeter should not be null"); } if(delimeterStr.equals("")){ //直接返回每個字符的字符串形式 String[] array = new String[srcStr.length()]; for(int i = 0;i<array.length;i++){ array[i]
= String.valueOf(srcStr.charAt(i)); } return array; } if (srcStr.length() > delimeterStr.length()) { //源字符串長度大於分隔符字符串長度 int i = srcStr.indexOf(delimeterStr); int j = i; int n = 0; int lastIndex = srcStr.length() - delimeterStr.length();
boolean lastStringIsDelimeter = false; while (i >= 0) { n++; i = srcStr.indexOf(delimeterStr, i + delimeterStr.length()); if (i == lastIndex) { // delimeter is the last string of the src, should not be counted lastStringIsDelimeter = true; break; } } String[] array = new String[n + 1]; n = i = 0; while (j >= 0) { if (j - i > 0) { array[n++] = srcStr.substring(i, j); } else if (j - i == 0) { // two delimeter is neighbour array[n++] = ""; } i = j + delimeterStr.length(); j = srcStr.indexOf(delimeterStr, i); } if (!lastStringIsDelimeter) { array[n] = srcStr.substring(i); } return array; } else if (srcStr.length() == delimeterStr.length()) { // 源字符串長度等於 分隔符字符串長度 if (srcStr.equals(delimeterStr)) { return new String[0]; } else { String[] array = new String[1]; array[0] = srcStr; return array; } } else { // 源字符串長度 小於 分隔符字符串長度 , 直接返回源字符串 String[] array = new String[1]; array[0] = srcStr; return array; } }

測試代碼:

        String src = "a.b.c.d.e.f.g.h.j.k.l.";
        src = "a..b..c..d..e..f..g..h..j..k..l";
        
        System.out.println("first-->");
        long start = System.nanoTime();
        String[] array = split(src, "..");
        long end = System.nanoTime();
        System.out.println("time:"+(end-start)+"ns");
        System.out.println("size:"+array.length);
        for(String s : array){
            System.out.println(s);
        }
        System.out.println("<--end");
        
        System.out.println("second-->");
        long start1 = System.nanoTime();
        String[] array2 = src.split("\\.\\.");
        long end1 = System.nanoTime();
        System.out.println("time:"+(end1-start1)+"ns");
        System.out.println("size:"+array2.length);
        for(String s : array2){
            System.out.println(s);
        }
        System.out.println("<--end");

運行結果,可以看出,不采用正則表達式時,速度快了一些,當然此單次測試並不一定準確, 讀者可以自己寫一個多次循環求平均值的代碼進行測試。

需要註意的是, 代碼中並未加鎖進行同步,因為此代碼沒有並發的問題,變量範圍始終在局部變量表內,JVM中是線程獨立的。

本人水平有限,如有問題,歡迎評論指正。

轉載請註明出處。

分享一個 Java String split 快速分割的方法