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中是线程独立的。
本人水平有限,如有问题,欢迎评论指正。
来源: http://www.bubuko.com/infodetail-2305653.html