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中是线程独立的。
本人水平有限,如有问题,欢迎评论指正。
转载请注明出处。