Java里String.split需要注意的用法
我们常常用String的split()方法去分割字符串,有两个地方值得注意:
1. 当分隔符是句号时("."),需要转义:
由于String.split是基于正则表达式来分割字符串,而句号在正则表达式里表示任意字符。
//Wrong:
//String[] words = tmp.split("."); //Correct:
String[] words = tmp.split("\\.");
所以,假设分隔符在正则表达式里有一定的意义时,需要格外留心,必须将它们转义才能达到分割的效果。
2. 假设字符串最后有连续多个分隔符,且这些分隔符都需要被分割的话,需要调用split(String regex,int limit)这个方法:
String abc = "a,b,c,,,";
String[] str = abc.split(","); System.out.println(Arrays.toString(str)+" "+str.length); String[] str2 = abc.split(",",-1); System.out.println(Arrays.toString(str2)+" "+str2.length);
输出如下:
[a, b, c] 3
[a, b, c, , , ] 6
需要输出csv文件的时候,尤其需要注意。
3. 假设需要快速分割字符串,split()并不是最有效的方法。在split()方法内,有如下的实现:
public String[] split(String regex, int limit) {
return Pattern.compile(regex).split(this, limit);
}
频繁调用split()会不断创建Pattern这个对象,因此可以这样去实现,减少Pattern的创建:
//create the Pattern object outside the loop
Pattern pattern = Pattern.compile(" "); for (int i = 0; i < 1000000; i++)
{
String[] split = pattern.split("Hello World", 0);
list.add(split);
}
另外split()也往往比indexOf()+subString()这个组合分割字符串要稍慢,详情可看这个帖子。
我在本机做过测试,感觉indexOf()+subString()比split()快一倍:
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 100000; i < 100000 + 60; i++)
sb.append(i).append(' ');
String sample = sb.toString();
int runs = 100000;
for (int i = 0; i < 5; i++) {
{
long start = System.nanoTime();
for (int r = 0; r < runs; r++) {
StringTokenizer st = new StringTokenizer(sample);
List<String> list = new ArrayList<String>();
while (st.hasMoreTokens())
list.add(st.nextToken());
}
long time = System.nanoTime() - start;
System.out.printf("StringTokenizer took an average of %.1f us%n", time / runs
/ 1000.0);
}
{
long start = System.nanoTime();
Pattern spacePattern = Pattern.compile(" ");
for (int r = 0; r < runs; r++) {
List<String> list = Arrays.asList(spacePattern.split(sample, 0));
}
long time = System.nanoTime() - start;
System.out.printf("Pattern.split took an average of %.1f us%n", time / runs
/ 1000.0);
}
{
long start = System.nanoTime();
for (int r = 0; r < runs; r++) {
List<String> list = new ArrayList<String>();
int pos = 0, end;
while ((end = sample.indexOf(' ', pos)) >= 0) {
list.add(sample.substring(pos, end));
pos = end + 1;
}
}
long time = System.nanoTime() - start;
System.out
.printf("indexOf loop took an average of %.1f us%n", time / runs / 1000.0);
}
}
}
在jdk1.7测试后,结果如下:
StringTokenizer took an average of 7.2 us
Pattern.split took an average of 7.9 us
indexOf loop took an average of 3.5 us
------------------------------------------
StringTokenizer took an average of 6.8 us
Pattern.split took an average of 5.4 us
indexOf loop took an average of 3.1 us
------------------------------------------
StringTokenizer took an average of 6.0 us
Pattern.split took an average of 5.5 us
indexOf loop took an average of 3.1 us
------------------------------------------
StringTokenizer took an average of 5.9 us
Pattern.split took an average of 5.5 us
indexOf loop took an average of 3.1 us
------------------------------------------
StringTokenizer took an average of 6.4 us
Pattern.split took an average of 5.5 us
indexOf loop took an average of 3.2 us
本文完
Java里String.split需要注意的用法的更多相关文章
- java里String类为何被设计为final
前些天面试遇到一个非常难的关于String的问题,"String为何被设计为不可变的"?类似的问题也有"String为何被设计为final?"个人认为还是前面一 ...
- 字符串分割--Java中String.split()用法
转载自:http://blog.163.com/zs_note/blog/static/199386112201110804233558/ 在java.lang包中有String.split()方法, ...
- Java里字符串split方法
Java中的split方法以"."切割字符串时,需要转义 String str[] = s.split("\\.");
- Java 的 String.split 函数,消除空字符串
代码: String str = "the music made it hard to concentrate"; String delims = "[ ]+" ...
- 【Java】Java里String 的equals和==
Java里面有对象和对象的引用的概念,在String方面,==比较的是引用,equals比较的是对象的具体值. String s1 = new String("abc");Stri ...
- java的string.split()分割特殊字符时注意点
[1]单个符号作为分隔符 String address="上海|上海市|闵行区|吴中路"; String[] splitAddress=address.s ...
- java.lang.string split 以点分割字符串无法正常拆分字符串
//错误的做法String ip="192.168.11.23"; String[] spstr_IP=ip.split(".");//这种方式无法拆分在ip字 ...
- java/Android String.split 字符串分割
特殊符号分割时需加[].如下图
- Java——String.split()函数
在java doc里有 String[] java.lang.String.split(String regex) Splits this string around matches of the g ...
随机推荐
- jQuery Datepicker日期控件
datepicker可以为bootstrap添加一个事件选择控件,适用于任何需要调用的场合,支持多种事件格式输出(比如:dd, d, mm, m, yyyy, yy等),是制作网页不可缺失的插件. R ...
- jquery背景自动切换特效
查看效果网址:http://keleyi.com/a/bjad/4kwkql05.htm 本特效的jquery版本只支持1.9.0以下. 代码如下: <!DOCTYPE html PUBLIC ...
- 一款简洁大气的jquery日期日历插件
本jquery插件名为manhuaDate,暂时只支持jquery 1.9.0以下版本,比如jquery-1.8.3.min.js 查看效果网址:http://keleyi.com/a/bjad/em ...
- 基于HTML5 Canvas实现的图片马赛克模糊特效
效果请点击下面网址: http://hovertree.com/texiao/html5/1.htm 一.开门见山受美国肖像画家Chuck Close的启发,此脚本通过使用HTML5 canvas元素 ...
- SharePoint 2013 必备组件之 Windows Server AppFabric 安装错误
1.如下图,在使用SharePoint2013产品准备工具的时候,网上下载安装Windows Server AppFabric的时候,报错,点击完成重启计算机,重新安装依然报错. 2.无奈之下,只有选 ...
- Objective-C语言--属性和实例变量
看到一篇讲解特别清晰的blog,与大家共享:http://blog.csdn.net/addychen/article/details/39525681
- 了解HTML 盒模型
HTML在布局上, 有一个非常重要的模型, 那就是盒子模型, 在盒子模型中把标签内容理解为一个物品, 而css样式理解为包容着这个物品的盒子, 一般的块级标签都具有盒子模型的特征, 你可以在css中对 ...
- 关于iOS10
iOS10相册相机闪退bughttp://www.jianshu.com/p/5085430b029fiOS 10 因苹果健康导致闪退 crashhttp://www.jianshu.com/p/54 ...
- 报文格式:xml 、定长报文、变长报文
目前接触到的报文格式有三种:xml .定长报文.变长报文 . 此处只做简单介绍,日后应该会深入学习到三者之间如何解析,再继续更新.——2016.9.23 XML XML 被设计用来传输和存储数据. H ...
- numpy 函数一:linspace
接触 numpy 遇到的第一个函数可能就是 linspace 函数,但是对于我们这种没有学过 matlab 的人来说,根本不知道这是什么. 所以只能自己查资料. 词典显示: 线性等分向量 线性平分矢量 ...