`
lovekikio
  • 浏览: 2781 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

String split的更好认识

阅读更多
今天查看了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实例-String对象-唐诗三百首

    JavaScript是Web开发中不可或缺的一部分,尤其对于前端开发者来说,它提供了丰富的功能来处理文本数据,如字符串。在本实例中,“Javascript...通过实际操作,能够更好地掌握这些知识,并将其运用到自己的项目中去。

    C#读写ini文件.rar

    Ini文件是一种传统的配置文件格式,常见于Windows操作系统中,用于存储程序的设置和...通过运行这个示例,你将能够学习如何在C#程序中有效地处理INI文件,进行读取、写入和查询操作,从而更好地管理程序的配置信息。

    zf.rar_ZF_javascript_www.115zf.c

    标题中的"zf.rar_ZF_javascript_www.115zf.c"可能是一个压缩文件,其中包含了一系列...通过学习这些内容,开发者可以更好地处理数据、验证用户输入、优化字符串操作,并理解如何在ASP.NET应用中配置和管理配置文件。

    Python count函数使用方法实例解析

    为了更好地理解和掌握 `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...

    NumberBaseballGame

    在Java中,我们可以使用字符串处理方法(如`String.split()`)将玩家输入的字符串转化为整数数组,再与目标数字进行逐位比较。Java的条件语句(如`if...else`,`switch`)用于判断每个数字是否正确,以及位置是否...

    前端面试题

    - **提高搜索引擎友好性**:良好的代码结构可以帮助搜索引擎更好地索引页面内容。 - **结构行为表现分离**:将内容、样式和交互逻辑分开管理,使得代码更易于维护和更新。 - **文件下载与页面加载速度**:通过...

    Python端口扫描简单程序

    ### Python端口扫描程序知识点详解 ...理解这些技术细节不仅能帮助我们更好地运用Python进行网络编程,还能加深对网络安全领域的认识。此外,还可以进一步探索如何优化扫描性能、增强扫描策略等高级话题。

    Ext Js权威指南(.zip.001

    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...

Global site tag (gtag.js) - Google Analytics