一、思考的源头来历:阿里巴巴JAVA规范
【推荐】使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无内容的检查,
否则会有抛 IndexOutOfBoundsException 的风险。
说明:
String str = “a,b,c,”;
String[] ary = str.split(“,”);
// 预期大于 3,结果等于 3
System.out.println(ary.length);
二、代码解决方案
- 若干最后n位都是切割符,split(" “)不会继续切分,split(” ", -1)会继续切分
String line = "a|b||c|||||||";
String [] tmp = line.split("\\|");
System.out.println(tmp.length+"------");
for(int i=0;i<tmp.length;i++){
System.out.println(i+"="+tmp[i]);
}
String [] items = line.split("\\|",-1);
System.out.println(items.length+"========");
for(int i=0;i<items.length;i++){
System.out.println(i+"="+items[i]);
}
运行结果:
4------
0=a
1=b
2=
3=c
11========
0=a
1=b
2=
3=c
4=
5=
6=
7=
8=
9=
10=
- 如果字符串最后一位有值,则没有区别
String line = "a|b||c|||||||d";
String [] tmp = line.split("\\|");
System.out.println(tmp.length+"------");
for(int i=0;i<tmp.length;i++){
System.out.println(i+"="+tmp[i]);
}
String [] items = line.split("\\|",-1);
System.out.println(items.length+"========");
for(int i=0;i<items.length;i++){
System.out.println(i+"="+items[i]);
运行结果
11------
0=a
1=b
2=
3=c
4=
5=
6=
7=
8=
9=
10=d
11========
0=a
1=b
2=
3=c
4=
5=
6=
7=
8=
9=
10=d
三、精简版解释
正常的数据格式A:
AAA|BBB|CCC|DDD|EEE
当最后一个栏位没有值时(并不代表该字段不存在,只是没有传值)的数据格式B:
AAA|BBB|CCC|DDD|
注意字符串末尾的差别,使用String.split(“|”)去分割该字符串时,A格式处理后返回的数组长度是5:[AAA,BBB,CCC,DDD,EEE];
而B格式处理后的结果是**[AAA,BBB,CCC,DDD],但是我想要的结果是[AAA,BBB,CCC,DDD,]**,最后一个栏位并不是不存在,只是为空值而已。
查看API文档后发现,直接使用String.split(“|”)时,内部其实调用的是split(“|”,0)方法。具体自行查看API文档。
解决办法:
使用String.split(“|”,-1)方法,传入-1的意思是尽可能多地分割字符串,包含末尾的空字符串。
四、个人观点
在实际项目中还是带上这个-1参数,减少不必要的麻烦