今天查看了String.split的实现方式,对于其中的实现原理与弊端进行一个更好的认识.
1.split的参数是一个regex,正则表达式.
要说到正则表达式,那就避免不了特殊字符的转义,比如+号,|号等都需要继续转义的.
2.性能优劣
正则表达式是需要complie的,那么就会有时间上的消耗.
而String.split这个方法的调用如下:
public String[] split(String regex, int limit) {
return Pattern.compile(regex).split(this, limit);
}
调用的是Pattern.compile(regex)返回的Pattern对象的split方法.
而Pattern.complie(regex)方法是直接new Pattern(regex,0);
private Pattern(String p, int f) {
pattern = p;
flags = f;
// Reset group index count
capturingGroupCount = 1;
localCount = 0;
if (pattern.length() > 0) {
compile();
} else {
root = new Start(lastAccept);
matchRoot = lastAccept;
}
}
在深入看一下compile()方法,
其中最后一句如下:
compiled = true;
这个是一个:
/**
* Boolean indicating this Pattern is compiled; this is necessary in order
* to lazily compile deserialized Patterns.
*/
private transient volatile boolean compiled = false;
非静态的变量.
再来看看split方法:
其中有去获取Matcher对象的步骤:
Matcher m = matcher(input);
public Matcher matcher(CharSequence input) {
if (!compiled) {
synchronized(this) {
if (!compiled)
compile();
}
}
Matcher m = new Matcher(this, input);
return m;
}
如果compile()没有进行的话,就进行一个compile()步骤.
问题就在整理了,使用String.split(regex)方法是直接new 一个Pattern实例,每次都会进行一次compile(),消耗就在这里了...
所以说,如果可以的话,最后是定义好一个Pattern供所有的地方调用....
再来说一下Pattern的split(regex,limit)的方法.
这里面有limit参数,限制了匹配的次数.如果是0的话,便是总是去匹配,如果大于0,进行有效匹配.
使用例子来:
String s = "a,b,c:e,f,g";
String[] split = s.split(",");
System.out.println(Arrays.toString(split));
String[] split3 = s.split(",", 1);//得到长度为0
System.out.println(split3.length);
System.out.println(Arrays.toString(split3));
String[] split4 = s.split(",", 3);//得到长度为3
System.out.println(split4.length);
System.out.println(Arrays.toString(split4));
结果:
[a, b, c:e, f, g]
1
[a,b,c:e,f,g]
3
[a, b, c:e,f,g]
分享到:
相关推荐
JavaScript是Web开发中不可或缺的一部分,尤其对于前端开发者来说,它提供了丰富的功能来处理文本数据,如字符串。在本实例中,“Javascript...通过实际操作,能够更好地掌握这些知识,并将其运用到自己的项目中去。
Ini文件是一种传统的配置文件格式,常见于Windows操作系统中,用于存储程序的设置和...通过运行这个示例,你将能够学习如何在C#程序中有效地处理INI文件,进行读取、写入和查询操作,从而更好地管理程序的配置信息。
标题中的"zf.rar_ZF_javascript_www.115zf.c"可能是一个压缩文件,其中包含了一系列...通过学习这些内容,开发者可以更好地处理数据、验证用户输入、优化字符串操作,并理解如何在ASP.NET应用中配置和管理配置文件。
为了更好地理解和掌握 `count()` 方法,建议尝试以下扩展实践: - 尝试使用不同的字符串和子字符串进行测试。 - 探索如何结合其他字符串方法(如 `split()` 或 `join()`)使用 `count()` 方法解决更复杂的问题。 - ...
### 大数据分析实验报告知识点概览 #### 实验一:Hadoop与Spark环境构建及应用开发 ##### 实验目的与要求 本实验旨在使学生掌握...学生在完成这些实验后,将对Hadoop、Spark及其机器学习库有更深入的认识与理解。
String[] parts = line.split(","); String origin = parts[1].trim(); // 更新哈希表 originCount.put(origin, originCount.getOrDefault(origin, 0) + 1); } reader.close(); // 输出结果 for (Map.Entry...
在Java中,我们可以使用字符串处理方法(如`String.split()`)将玩家输入的字符串转化为整数数组,再与目标数字进行逐位比较。Java的条件语句(如`if...else`,`switch`)用于判断每个数字是否正确,以及位置是否...
- **提高搜索引擎友好性**:良好的代码结构可以帮助搜索引擎更好地索引页面内容。 - **结构行为表现分离**:将内容、样式和交互逻辑分开管理,使得代码更易于维护和更新。 - **文件下载与页面加载速度**:通过...
### Python端口扫描程序知识点详解 ...理解这些技术细节不仅能帮助我们更好地运用Python进行网络编程,还能加深对网络安全领域的认识。此外,还可以进一步探索如何优化扫描性能、增强扫描策略等高级话题。
1.2.1 认识json / 3 1.2.2 json的结构 / 3 1.2.3 json的例子 / 4 1.2.4 在javascript中使用json / 4 1.2.5 在.net中使用json / 8 1.2.6 在java中使用json / 12 1.2.7 更多有关json的信息 / 15 1.3 ext js 4...