zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

2023-04-18 14:06:57 时间

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?C{0,3})" + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,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性能最好,但可能不如前两者灵活,可按需使用。