String spilt的使用和常见的坑以及平替方案性能比较

Posted 爱叨叨的程序狗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String spilt的使用和常见的坑以及平替方案性能比较相关的知识,希望对你有一定的参考价值。

String spilt用法

入参:

regex或regex,limit

将字符串根据某个符号(正则)进行分割成char数组。limit用于确定 分割后的字符串数组的长度。

返回值String []

方法一、入参仅正则regex

        String b = "This is the code, test 1 ,test 2";
        String b0 = b.split(",")[0];
        String b1 = b.split(",")[1];
        String b2 = b.split(",")[2];

        System.out.println(b0);
        System.out.println(b1);
        System.out.println(b2);

				//outPut:
				This is the code
 				test 1 
				test 2

方法二、入参regex,limit

        String a = "always This is the code, test 1 ,test 2";

        String s0 = a.split(",",2)[0];
        String s1 = a.split(",",2)[1];
        System.out.println(s0);
        System.out.println(s1);

				//outPut:
				always This is the code
				test 1 ,test 2
        
        //此时如果输出a.split(",",2)[2],也就是数组的第三个元素会报异常
          ArrayIndexOutOfBoundsException(数组越界)

谨慎使用:

在多线程或者请求量比较大的情况下慎用spilt方法,因为可能会导致OOM,spilt方法中使用了subString方法,导致最初的字符串引用无法被回收,过期引用永远无法被消除。

spilt虽好,可不要贪杯哦。

个人拙见

由于编译正则是大量消耗资源的操作,当大量使用spilt时,可以将正则规则设置为常量。

Demo:

    private static final Pattern ROMAN = Pattern.compile("^(?=.)M*(C[MD]|D?C0,3)" + "(X[CL]|L?X0,3)(I[XV]|V?I0,3)$");

    static boolean isRomanNumber(String s) 
        return ROMAN.matcher(s).matches();
    

spilt的平替方案

可按需选择:

StringTokenizer:

        StringTokenizer stringTokenizer = new StringTokenizer("also This is the code, test 1 ,test 2", ",");
        while (stringTokenizer.hasMoreTokens())
            String s = stringTokenizer.nextToken();
            System.out.println(s);
        

Hutool:

List<String> split = StrSpliter.split(a, ',');

性能比较

spilt性能中规中矩,可能出现OOM的问题,hutool不会出现过期引用导致OOM的问题,但是性能最慢,StringTokenizer性能最好,但可能不如前两者灵活,可按需使用。

以上是关于String spilt的使用和常见的坑以及平替方案性能比较的主要内容,如果未能解决你的问题,请参考以下文章

Java之spilt()函数

今天清华学长告诉你Python 参数类型以及在运用中常见的坑

sizeof运算符介绍以及常见的坑

常见的集合容器应当避免的坑

PhotoShop的平替: GIMP

java代码怎么判断文件的格式是excel文件