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中是线程独立的。

本人水平有限,如有问题,欢迎评论指正。

转载请注明出处。

最新文章

  1. 2000条你应知的WPF小姿势 基础篇&lt;45-50 Visual Tree&amp;Logic Tree 附带两个小工具&gt;
  2. [转] 有java基础的人如何转行做大数据?
  3. 1.1.1. Atitit Cocos2d-JS v3.x的问题
  4. 【BZOJ】1513: [POI2006]Tet-Tetris 3D
  5. 【原】训练自己haar-like特征分类器并识别物体(2)
  6. Geetest 极验验证 验证图片拼图
  7. Factorial Trailing Zeroes
  8. spring autoWire注解和@resource注解区别
  9. Hash表
  10. UITableView 小节-备
  11. iCIBA简单案例
  12. windows MySQL 安装
  13. 使用clipboard.js实现复制内容至剪贴板
  14. Android系统应用Mms之短信会话列表加载流程一
  15. [2019BUAA软工助教]答黄杉同学
  16. bzoj1014 火星人 (hash+splay+二分答案)
  17. python多进程那点事儿【multiprocessing库】
  18. Python不支持函数重载
  19. Java 基础功底
  20. linux mv命令详解

热门文章

  1. 事件冒泡及事件委托的理解(JQuery Dom操作)
  2. wgrib读grib数据
  3. 获取手机浏览器IP的函数
  4. 《算法》第四章部分程序 part 2
  5. checked选择器实现tab切换
  6. SVM视频跟踪
  7. How to start a VirtualBox VM headless in Windows 10
  8. spark 集成elasticsearch
  9. linux终端发送邮件
  10. DbUtil数据库连接