你真的了解String字符串中的分割吗?

三种方法实现String字符串的分割

Posted by MasterJen on November 18, 2018

Hey String Split

A man’s best friends are his ten fingers. – 人最好的朋友是自己的十个手指.

大家都知道String字符串是长度不可变的,对它的操作,都会new成新的字符串,比如 字符串的分割,也会产生新的字符串,其值value保存在常量池中,现在就给大家说一下String中的三种分割方式.

爱码如下:

public class StringSpiltTest {
//    原始的分割 方式
    private static void test1(){
         long start = System.currentTimeMillis();
        String  orgStr = null;
//        生成 字符串
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i <10000 ; i++) {
            stringBuffer.append(i);
            stringBuffer.append(";");
        }
        orgStr = stringBuffer.toString();
//        进行分割
        for (int i = 0; i <10000 ; i++) {
            orgStr.split(";");
        }
        System.out.println("花费了--" + (System.currentTimeMillis() - start) + "ms--时间");
    }
//     通过 StringTokenizer 的方式进行分割
    private static void test2(){
        long start = System.currentTimeMillis();
        String  orgStr = null;
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i <10000 ; i++) {
            stringBuffer.append(i);
            stringBuffer.append(";");
        }
        orgStr = stringBuffer.toString();
        StringTokenizer stringTokenizer = new StringTokenizer(orgStr,";");
        for (int i = 0; i <10000 ; i++) {
//            进行分割 完成了 spilt
            while (stringTokenizer.hasMoreTokens()){
                stringTokenizer.nextToken();
            }
//            重新分割
            stringTokenizer = new StringTokenizer(orgStr,";" );
        }
        System.out.println("花费了--" + (System.currentTimeMillis() - start) + "ms--时间");
    }
//    通过 indexOf  以及 subString 的方法进行分割 效率高点
    public static void test3(){
        long start = System.currentTimeMillis();
        String  orgStr = null;
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i <10000 ; i++) {
            stringBuffer.append(i);
            stringBuffer.append(";");
        }
        orgStr = stringBuffer.toString();

        String temp = orgStr;
        for (int i = 0; i < 10000; i++) {
            while (true){
                String spiltStr = null;
//                找到 分隔符    `;`
                int j = temp.indexOf(";");
                if(j<0)
                    break;
//                截取字符串
                spiltStr = temp.substring(0,j);
//                处理剩余字符串
                temp = temp.substring(j+1);
            }
        }
        System.out.println("花费了--" + (System.currentTimeMillis() - start) + "ms--时间");

    }
      public static void main(String[] args) {
        test1();
        test2();
        test3();
    }
}

测试结果:

  test1 -- >花费了--4461ms--时间
  test2 -- >花费了--3817ms--时间
  test3 -- >花费了--70ms--时间

由此可知 String中的split是效率比较慢的,但是在开发中就需要需求进行写了,需要对各个方法进行权衡处理,采取最实用的方法.