• Java8字符串分割的几种方式及性能比较


    一、方法

      1、通过indexOf和substring这两个方法实现字符串分割

        实现逻辑:

          利用indexOf找出分割的字符在字符串中的位置,根据分割字符的位置切割字符串,再将分割好的字符串放进结果集。

        实现代码如下:

      /**
         * @Description: 通过indexof分割字符串
         * @Param: [str, regx]
         * @return: java.lang.String[]
         * @Author: YinYichang
         * @Date: 2018/7/18
         */
        public static String[] splitByIndex(String str, String regx) {
            //字符串截取的开始位置
            int begin = 0;
            //字符串截取的结束位置
            int limit = 0;
            //截取分割得到的字符串
            String splitStr = "";
            ArrayList<String> result = new ArrayList<String>();
            while (str.indexOf(regx) != -1) {
                //设置要截取的位置
                limit = str.indexOf(regx);
                splitStr = str.substring(begin, limit);
                //设置截取后的字符串
                str = str.substring(limit + 1, str.length());
                result.add(splitStr);
            }
            if (!StringUtil.isBlank(str)) {
                result.add(str);
            }
            String[] strs = new String[result.size()];
            return result.toArray(strs);
        }

      2、通过charAt和substring这两个方法实现字符串分割

        实现逻辑:

          同上,通过charAt方法找出字符所在字符串中的位置,再实现如同方法1的逻辑即可得到分割后的字符串结果集。

        实现代码如下:

      /**
         * @Description: 通过charAt分割字符串
         * @Param: [str, regx]
         * @return: java.lang.String[]
         * @Author: YinYichang
         * @Date: 2018/7/18
         */
        public static String[] splitByCharAt(String str, char regx) {
            //字符串截取的开始位置
            int begin = 0;
            //截取分割得到的字符串
            String splitStr = "";
            ArrayList<String> result = new ArrayList<String>();
            int length = str.length();
            //计数器
            int i = 0;
            for (i = 0; i < length;i++ ) {
                if (str.charAt(i) == regx) {
                    splitStr = str.substring(begin, i);
                    result.add(splitStr);
                    str = str.substring(i + 1, length);
                    length = str.length();
                    i = 0;
                }
            }
            if (!StringUtil.isBlank(str)) {
                result.add(str);
            }
            String[] strs = new String[result.size()];
            return result.toArray(strs);
        }

      3、通过java自带的split方法分割字符串

      4、通过StringTokenizer对字符串进行分割

        通过这种方法分割字符串的使用频率比较少,这种分割需要创建新的对象(对内存造成不必要的开支),虽然该方法提供了提取分割结果的方法,但是也比较麻烦并没有数组那么简单。  

      /**
         * @Description: 通过StringTokenizer分割字符串, 该方
         * 法分割后将结果封装并提供相关方法提取(很少用到)
         * @Param: [str, regx]
         * @return: StringTokenizer
         * @Author: YinYichang
         * @Date: 2018/7/18
         */
        public static StringTokenizer splitByStringTokenizer(String str, String regx) {
            StringTokenizer stringTokenizer = new StringTokenizer(str, regx);
            return stringTokenizer;
        }

    二、性能测试

      由于StringTokenizer很少用到就不测试了,主要测试两种自定义的分割方法和java自带的方法。

      测试代码如下:

         String str = "a,b,c,d,e,f,g";
            System.out.println("测试代码循环10000次。。。,结果如下:");
            long length = 10000;
    
            //indexof字符串分割测试
            long begin = System.currentTimeMillis();
            for (int i = 0; i < length; i++) {
                String[] strs = SplitStr.splitByIndex(str, ",");
            }
            long end = System.currentTimeMillis();
            System.out.println("indexof分割字符串返回数组用时:"+(end - begin));
    
            //charAt字符串分割测试
            begin = System.currentTimeMillis();
            for (int i = 0; i < length; i++) {
                String[] strs = SplitStr.splitByCharAt(str, ',');
            }
            end = System.currentTimeMillis();
            System.out.println("charAt分割字符串返回数组用时:"+(end - begin));
    
            //split字符串分割测试
            begin = System.currentTimeMillis();
            for (int i = 0; i < length; i++) {
                String[] strs = str.split(",");
            }
            end = System.currentTimeMillis();
            System.out.println("split分割字符串用时:"+(end - begin));

      测试结果:

    以上测试结果,分别对三种方法循环测试1000次、10000次和100000次,由结果可以看出利用charAt分割字符串的效率是最高的。

    其实,查看split方法的实现代码后发现,split采用的分割方式是和自定义的第一种方式类似的,可以看出中两者的差距不是特别大。

    代码优化任重道远,如有问题希望给与指正!

    初心回归,时光已逝!
  • 相关阅读:
    Codeforces Round #352 (Div. 1) B. Robin Hood (二分)
    Codeforces Round #209 (Div. 2) D. Pair of Numbers (模拟)
    Kattis
    kattis Curious Cupid (莫队算法)
    HYSBZ
    SPOJ NETADMIN
    day26-2 基于TCP协议的套接字编程
    day26-1 TCP三次握手和四次挥手
    day25-2 OSI协议和socket抽象层
    day25-1 网络架构与互联网组成
  • 原文地址:https://www.cnblogs.com/yin1361866686/p/10343499.html
Copyright © 2020-2023  润新知