今天查看了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]
分享到:
相关推荐
split string
String.split()方法使用总结
java中String类的intern、split方法的详细讲解。
java的String[] split 示例
public static String[] split(String s, String regex) s参数为待拆分字符串, regex参数有两种格式: 单字符的字符串(长度1),功能如下:split(“ab#12#453”, “#”) 返回带5个元素的数组:ab, #, 12, #, 453 ...
用来学习scala以及spark,用scala写的字符串验证以及字符串分割算子
主要介绍了String split方法实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要说了string类 常用函数的使用技巧 注意点
功率分配因为有时String.split()还不够! 这是一个小型的Typescript库,我出于无奈而从头开始编写了命令行解析器。 它提供了一些实用程序方法来解决一些用例,而这些用例String.split()调用将无法解决。它能做什么?...
西门子1200PLC字符串分割函数,采用SCL语言写,通过“外部源文件”添加到项目中,然后对该文件右键--选择“由源生成块”即生成该函数。
语法 stringObject.split(separator, howmany)参数 描述 separator 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。 howmany 可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的...
string[] sArray=s.Split('c') ; foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab deab deab de 第二种方法 我们看到了结果是以一个指定的字符进行的分割。使用另一种构造方法对...
1 split字符串 之前在用C#写代码的时候,用过split函数,可以把一个字符串根据某个分隔符分成若干个字符串数组。在用C++操纵字符串的时候,我一直使用很笨的遍历的方法。为此,我问候过很多次C++标准委员会。直到某...
主要介绍了Java中String.split()用法小结的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
柯里化的String.prototype.split支持按字符串、正则表达式或函数进行拆分。 npm install string-split --save npm 统计信息 例子 要求 var split = require ( 'string-split' ) ; 完整的应用程序 split ( "." , ...
String[] split(String regex) boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引 int ...
这是我遇到的问题,然后发现pb里没有split方法,就自己写了一个,应该还能算是简单而实用吧
String和string区别以及string详解
分解string字符串为char型数组 相当于VB中的split
C#中char[]与string之间的转换 C#中char[]与string之间的转换是一种常见的操作,我们经常需要在这两种数据类型之间进行转换。今天,我们将探讨C#中char[]与string之间的转换,包括string转换成Char[]和Char[]转换成...