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

Posted 音译昌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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采用的分割方式是和自定义的第一种方式类似的,可以看出中两者的差距不是特别大。

 

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

以上是关于Java8字符串分割的几种方式及性能比较的主要内容,如果未能解决你的问题,请参考以下文章

求斐波那契数列第n位的几种实现方式及性能对比(c#语言)

javascript 合并数组的几种方式及性能差异

Bean复制的几种框架性能比较(Apache BeanUtilsPropertyUtils,Spring BeanUtils,Cglib BeanCopier)

java集合遍历的几种方式总结及比较

Redis的几种高可用集群方案

java8 遍历数组的几种方式