String spilt用法
入参: regex或regex,limit 将字符串根据某个符号(正则)进行分割成char数组。limit用于确定 分割后的字符串数组的长度。 返回值String []
方法一、入参仅正则regex
代码语言:javascript复制 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
代码语言:javascript复制 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:
代码语言:javascript复制 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:
代码语言:javascript复制 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:
代码语言:javascript复制List<String> split = StrSpliter.split(a, ',');
性能比较
spilt性能中规中矩,可能出现OOM的问题,hutool不会出现过期引用导致OOM的问题,但是性能最慢,StringTokenizer性能最好,但可能不如前两者灵活,可按需使用。