[Java]_[初级]_[高效使用String.split的方法]
Posted infoworld
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java]_[初级]_[高效使用String.split的方法]相关的知识,希望对你有一定的参考价值。
场景
- 在开发
Java Web
项目时, 往往需要分析uri
来做一些转发控制逻辑,如/online/android/info/support.html
, 对uri
的不同部分做处理. 一般情况下使用String.split(str)
方法进行分割,但其实这个方法有更高效率的用法。
说明
-
String.split
方法有两个重载方法,分别是带和不带limit
参数的.String[] split(String regex); String[] split(String regex,int limit);
-
不带参数的
split
其实就是调用split(regex,0)
. 所以这里说下第二个方法. 它的limit
参数是有符号的整数,支持正整数,负整数和0
.-
正整数: 模式匹配会应用最多
limit -1
次,数组长度不会超过limit
,并且数组的最后一个元素包含最后匹配的分割符之后的所有字符串。说明:也就是这个limit
是限制了分割的次数,如果应用的uri
最多只是3
级,那么我们可以使用limit
限定次数,当一些不支持的uri
出现时可以直接丢弃.如uri
最多只支持/xx/xx/xx.html
. 而如果接收到/xx/xx/xx/xx.html
,那么使用String.split(str,4)
时获取的数组最后的元素是xx/xx.html
,这时候判断这个字符串不符合要求,可以直接跳转到404
. -
0: 模式匹配将会应用最大的次数,数组可能是任意大小,如果最后的分割符之后的字符串是空字符串,那么回丢弃,不会存入数组里,但是第一个分割符之前如果是空字符串,那么会保留。如字符串
/online/
分割后得到的数组是["","online"]
. -
任意负数: 只要是负数,任何负数值都是一样的。它的规则是
0
一样,执行所有的分割符查询,之后如果最后一个分割符后是空字符串,那么也会存入数组里。如/online/
分割后得到["","online",""]
.
-
例子
package com.example.string;
import org.junit.jupiter.api.Test;
/**
* Unit test for simple App.
*/
class AppTest {
private String format(String [] args){
StringBuilder sb = new StringBuilder();
sb.append("[");
for (String one : args)
sb.append("\\"").append(one).append("\\",");
sb.replace(sb.length()-1, sb.length(), "]");
return sb.toString();
}
public String tag(int limit){
return "limit "+limit+" ->";
}
public void print(String str){
System.out.println(str);
}
@Test
void testStringSplit(){
String kOnlineSlash2 = "/online/";
String[] parts = kOnlineSlash2.split("/", 4);
print(kOnlineSlash2);
print(tag(4)+format(parts));
// 相当于split("/");
parts = kOnlineSlash2.split("/",0);
print(tag(0)+format(parts));
parts = kOnlineSlash2.split("/",-2);
print(tag(-2)+format(parts));
String kOnlineSlash1 = "/online";
print(kOnlineSlash1);
parts = kOnlineSlash1.split("/", 4);
print(tag(4)+format(parts));
String kOnlineSlash3 = "/online/android/help.html";
print(kOnlineSlash3);
parts = kOnlineSlash3.split("/", 4);
print(tag(4)+format(parts));
String kOnlineHtml = "/online.html";
print(kOnlineHtml);
parts = kOnlineHtml.split("/", 4);
print(tag(4)+format(parts));
String kOnlineAndroid = "/online/android";
print(kOnlineAndroid);
parts = kOnlineAndroid.split("/", 4);
print(tag(4)+format(parts));
String kOnlineAndroidHtml = "/online/android.html";
print(kOnlineAndroidHtml);
parts = kOnlineAndroidHtml.split("/", 4);
print(tag(4)+format(parts));
String kOnlineAndroidSlashEnd = "/online/android/";
print(kOnlineAndroidSlashEnd);
parts = kOnlineAndroidSlashEnd.split("/", 4);
print(tag(4)+format(parts));
String kOnlineSlash4 = "/online/android/info/support.html";
print(kOnlineSlash4);
parts = kOnlineSlash4.split("/", 4);
print(tag(4)+format(parts));
}
}
输出
/online/
limit 4 ->["","online",""]
limit 0 ->["","online"]
limit -2 ->["","online",""]
/online
limit 4 ->["","online"]
/online/android/help.html
limit 4 ->["","online","android","help.html"]
/online.html
limit 4 ->["","online.html"]
/online/android
limit 4 ->["","online","android"]
/online/android.html
limit 4 ->["","online","android.html"]
/online/android/
limit 4 ->["","online","android",""]
/online/android/info/support.html
limit 4 ->["","online","android","info/support.html"]
参考
以上是关于[Java]_[初级]_[高效使用String.split的方法]的主要内容,如果未能解决你的问题,请参考以下文章
[Java]_[初级]_[使用正则高效替换字符串的多个占位符为多个值]
[Java]_[初级]_[使用正则高效替换字符串的多个占位符为多个值]
[Java]_[初级]_[并发下使用AtomicReference来保证原子读写对象]