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的使用和常见的坑以及平替方案性能比较的主要内容,如果未能解决你的问题,请参考以下文章