分享一個 Java String split 快速分割的方法
阿新 • • 發佈:2017-09-13
均值 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 快速分割的方法