java中在处理String字符串时,很多场合都要使用split方法

本文就全面剖析 split(String regex, int limit)的用法

先来看看API:

/ **

* @param  regex

*         the delimiting regular expression

*

* @param  limit

*         the result threshold, as described above

*

* @return  the array of strings computed by splitting this string

*          around matches of the given regular expression

*

* @throws  PatternSyntaxException

*          if the regular expression's syntax is invalid

*

* @see java.util.regex.Pattern

*

* @since 1.4

* @spec JSR-51

*/

public String[] split(String regex, int limit) {

return Pattern.compile(regex).split(this, limit);

}

经过上面一篇的内容,已经知道了第一个参数是正则表达式

这里就着重说下第二个参数的含义,就是返回值数组的最大长度

来个例子

Code:

package chapter4;

/**

* Created by MyWorld on 2016/3/28.

*/

public class StringSplitDemo {

public static void main(String[] args) {

String demoStr = "v1|v2|v3";

String[] result = demoStr.split("\\|", 2);

for (String s : result) {

System.out.println(s);

}

}

}

执行下看看是不是返回数组的长度 是不是最大是2

Output:

v1

v2|v3

没有看懂吧

一起再来看看API

聊聊个人的理解,使用limit值,可以提高效率

就以刚才的例子,因为是split后的数组长度是3,如果limit是2,则就少匹配一次了

不少tx是不是觉得split(String regex, int limit)方法中的代码看着有些眼熟

是的,就是正则表达式30分钟入门系列里使用java.utilPattern

看下这个API的源码

public String[] split(CharSequence input, int limit) {

int index = 0;

boolean matchLimited = limit > 0;

ArrayList matchList = new ArrayList();

Matcher m = matcher(input);

// Add segments before each match found

while(m.find()) {

if (!matchLimited || matchList.size() < limit - 1) {

String match =

input.subSequence

(index,

m.start()

).toString();

matchList.add(match);

index = m.end();

} else if (matchList.size() == limit - 1) { // last one

String match = input.subSequence(index,                                             input.length()).toString();

matchList.add(match);

index = m.end();

}

}

// If no match was found, return this

if (index == 0)

return new String[] {input.toString()};

// Add remaining segment

if (!matchLimited || matchList.size() < limit)

matchList.add(input.subSequence(index, input.length()).toString());

// Construct result

int resultSize = matchList.size();

if (limit == 0)

while (resultSize > 0 && matchList.get(resultSize-1).equals(""))

resultSize--;

String[] result = new String[resultSize];

return

matchList.subList(0, resultSize).toArray

(result);

}

上述源码也印证刚才的分析。

如果确定只获取前几个split后的子串,使用合适的limit值会减少使用正则表达式匹配的次数,有利于提高效率

如果对多个字符串进行split操作,直接使用字符串的split(String regex)是否合适呢?

当然在功能上是没有影响,这个地方聊聊性能吧

大家看看下面下面这两种写法的效率

Code:

package chapter4;

import java.util.ArrayList;

import java.util.List;

import java.util.regex.Pattern;

/**

* Created by MyWorld on 2016/3/28.

*/

public class StringSplitDemo {

public static void main(String[] args) {

List source = new ArrayList(10000);

String demoStr = "v1|v2|v3";

for (int i = 0; i < 10000; i++) {

source.add(demoStr);

}        long begin = System.currentTimeMillis();

for (String str : source) {

str.split("\\|");

}

System.out.println("Cost :" + (System.currentTimeMillis() - begin));

begin = System.currentTimeMillis();

Pattern pattern = Pattern.compile("\\|");

for (String str : source) {

pattern.split(str);

}

System.out.println("Cost :" + (System.currentTimeMillis() - begin));

}

}

执行下看看结果

Output:

Cost :53

Cost :14

从上面的执行结果上看,差别不是很大

因为上面使用正则表达式也比较简单了

使用相同正则表达式匹配多个字符串的场景,建议直接使用

java.util.regex.Pattern

而不是使用字符串的split方法

如果数据量不大,差别就不明显,根据情况斟酌使用吧

java str.split(quot;cquot;),你真的完全理解了String的split方法?之二相关推荐

  1. java双斜线转义_转义字符\(在hive+shell以及java中注意事项):正则表达式的转义字符为双斜线,split函数解析也是正则...

    转义字符将后边字符转义,使特殊功能字符作为普通字符处理,或者普通字符转化为特殊功能字符. 各个语言中都用应用,如java.python.sql.hive.shell等等. 如sql中 "\& ...

  2. JAVA中String的split方法

    我的个人网站: http://riun.xyz 以下源码版本:JDK1.8 简介 Java 中 String 的 split 方法可以将字符串根据指定的间隔进行切割,例如字符串 str = " ...

  3. Java 递归解决 quot;仅仅能两数相乘的计算器计算x^yquot; 问题

    Java 递归解决 "仅仅能两数相乘的计算器计算x^y" 问题 /*** 求一个数的乘方* 求x^y,y是一个正整数. 设计算器仅仅能计算两数相乘,不能一次计算n个数相乘. * 知 ...

  4. java中的console是干什么的_[Java教程]javascript中,你真的会用console吗?

    [Java教程]javascript中,你真的会用console吗? 0 2015-08-11 17:00:09 使用console进行性能测试和计算代码运行时间 对于前端开发人员,在开发过程中经常需 ...

  5. Java中线程池,你真的会用吗

    转载自   Java中线程池,你真的会用吗 在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Ex ...

  6. Java 中String的split函数简介

    在字符串处理过程中,我们经常遇到要把一个字符串转出字符数组,使用的split函数,下面就该函数进行简单说明. split 方法:将一个字符串分割为子字符串,然后将结果作为字符串数组返回. string ...

  7. Java 中的 BigDecimal,你真的会用吗?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | LanceToBigData 来源 | cnb ...

  8. Java中字符串以小数点分割时无效,String s = “12.34“; String[] ss = split(“.“);分割结果为空

    String s = "12.34"; String[] ss = split("."); //输出结果ss为null 解决:小数点 . 是正则表达式中特殊标记 ...

  9. java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/Str

    解决方案: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/la ...

最新文章

  1. Ext结合DWR的关键代码(运行成功的DWRProxy)
  2. centos7 JDK1.8
  3. Latex: 设置 threeparttable footnote 行宽度
  4. mfc实现秒表小项目
  5. 深度学习模型在训练集上很好而在测试集表现得不好而拟合次数并不多_机器学习中的过拟合,欠拟合和偏倚方差折衷...
  6. [转载]利用TTL值来鉴别操作系统
  7. 深入理解JVM(4)——如何优化Java GC
  8. spring教程笔记5
  9. oracle 触发器入门,ORACLE PL/SQ入门 (存储过程、触发器)
  10. 计算机桌面图片查看,电脑中查看微软bing缤纷桌面中图片信息方法
  11. Java核心技术 卷I 基础知识 学习笔记(1)
  12. 非合作博弈篇——混合策略博弈(mixed strategy)
  13. java 多线程面试题及答案
  14. 由中缀、后缀确定前缀表达式
  15. 虚拟服务器不识别网银盾,电脑浏览器无法使用建行E路航网银盾的解决方法
  16. 基金销售:基金转换与超级转换
  17. 29岁华为员工工资曝光,揭露残酷真相:职场下半场,拼的就是这项能力!
  18. Serenity框架官方文档翻译(1-2开始、安装和界面)
  19. python无法正常启动0xc000007b_应用程序无法正常启动(0xc000007b)。
  20. 转贴:粒子在施瓦西黑洞内部是如何运动的?

热门文章

  1. Git学习笔记;Git bash 库同步问题
  2. android 服务的应用,在Activity中实现背景音乐播放
  3. CPU核数跟多线程的关系
  4. Ubuntu 14.04 分区方案
  5. openCV滑动条TrackBar事件实例
  6. VTK修炼之道75:交互部件_测量类Widget的应用
  7. matlab 3D绘图详解
  8. 常用SQL语句书写技巧-
  9. [原创]同一页面无法多次使用XmlHttp发起Ajax请求的真实原因
  10. 【CyberSecurityLearning 2】IP地址与DOS命令