zoukankan      html  css  js  c++  java
  • 分享一个 Java String split 快速分割的方法

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

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

    转载请注明出处。

  • 相关阅读:
    Android ANR 知多少
    电源管理
    功耗分析
    手机功耗测试
    Battery Historian
    Android 电量优化
    Android手机功耗
    功耗 Log 抓取要求规范
    Android 手机无法进入系统解决方案
    定屏死机问题操作指南
  • 原文地址:https://www.cnblogs.com/selfchange/p/7514140.html
Copyright © 2011-2022 走看看