• java学习笔记之String.Split方法


     hello 大家好,好久不见,今天 我们要讨论的是java的split方法,或许你很早就知道了,但你真的知道吗?

     我们来看看吧。

    首先我们来看看我们最常用的split()方法也就是单个参数的方法

    public String[] split(String regex) {
          return split(regex, 0);
    }

    卧槽,这不是重载方法嘛,调用的是另外一个方法,而且还给了个默认值0,然后我们来看看重载的哪个方法

    public String[] split(String regex, int limit) {
        // Try fast splitting without allocating Pattern object
            String[] fast = Pattern.fastSplit(regex, this,limit);
            if (fast != null) {
                return fast;
            }
            return Pattern.compile(regex).split(this, limit);
    }

    ???这一串啥东西,不管了,既然这个方法的重载到此,我们就看看这个最底层的方法怎么用的吧

    int limit?这是啥?以下为API解释

    limit 参数控制模式应用的次数,因此影响所得数组的长度。如果该限制 n 大于 0,则模式将被最多应用 n - 1 次,数组的长度将不会大于 n,而且数组的最后一项将包含所有超出最后匹配的定界符的输入。如果 n 为非正,那么模式将被应用尽可能多的次数,而且数组可以是任何长度。如果 n 为 0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。

    是不是有点活在自己世界的说法,没办法自己来试呗。

     注意:下面的测试请注意测试字符串的变化

    1.默认方法测试,上面的代码可以看出,默认方法limit只是传的0而已。

    废话不说,我们来上手测试 (注意我们的测试字符串最后一个逗号后面是空的

    String str = "1,2,4,5,6,7,";
    String[] strArr = str.split(",");
            
    for(String s: strArr){
        System.out.println("分割:"+s);
    }
    System.out.println("数组长度:" + strArr.length);

    输出结果:

    分割:1
    分割:2
    分割:4
    分割:5
    分割:6
    分割:7
    数组长度:6

    测试结果:按照理论分割的话,那么最后一个“,”后面的空不是也应该也被分割出来嘛,但是发现测试结果最后一个空格被去掉了,那么是省去了吗?

                      1.去掉最后一个空格不分割。

    既然这样,那我拿多个空格在后面能去掉吗?

    来测试

            String str = "1,2,4,5,6,7,,,";
            String[] strArr = str.split(",");
            
            for(String s: strArr){
                System.out.println("分割:"+s);
            }
            System.out.println("数组长度:" + strArr.length);

    输出结果:

    分割:1
    分割:2
    分割:4
    分割:5
    分割:6
    分割:7
    数组长度:6

    测试结果:看来limit为0 时 分割的最后如果是空格,那么无论多少个空格都会被去掉

    其他猜想:1.若中间出现空格会去掉吗? (如: 1,2,3,,4,5,6,7)

                      2.若开头出现空格会去掉吗? (如:,,1,2,3,4,5,6,7)

    我就不贴代码了:1.中间的不会去掉空格,空格也会作为一个字符串存入分割后的数组中。

                                 2.开头的空格也不会去掉,也做保留。

    结论:当limit == 0 时,只有存在最后的空格会被去掉,其他的在中间和前面的都不会被去掉。

    2.当limit > 0时 测试开始。

            String str = "1,2,4,5,6,7";
            String[] strArr = str.split(",",5);
            
            for(String s: strArr){
                System.out.println("分割:"+s);
            }
            System.out.println("数组长度:" + strArr.length);

    输出结果

    分割:1
    分割:2
    分割:4
    分割:5
    分割:6,7
    数组长度:5

    What ?   最后一个分割冒出了一个 "6,7" ?????啥玩意啊?

    别急我们来看,这里的分割的个数是不是等于limit的填的数量?

    果然 limit 等于 分割个数  那这个就简单了

    测试结果:limit等于你要分割的份数。

    其他猜想:1.如果limit > 最大分割的份数(比如 “1,2,3,4,5,6,7”最大的分割其实是7份,大于最大分割也就是大于7)会怎么样呢?

                      2.如果limit 是小数怎么办?  

    结论:1.如果大于也只会按照最大的分割数分割。

               2.limit是整型,不能使用小数

    2.当limit < 0时 测试开始。

            String str = "1,2,4,5,6,7,";
            String[] strArr = str.split(",",-1);
            
            for(String s: strArr){
                System.out.println("分割:"+s);
            }
            System.out.println("数组长度:" + strArr.length);

     输出结果:

    分割:1
    分割:2
    分割:4
    分割:5
    分割:6
    分割:7
    分割:
    数组长度:7

     哈哈看到了有意思的了,最后一个空格他没有屏蔽

    后面也不买关子了

    结论:如果limit为负数,就不会去掉任何分割后的字符,至于 -1 和-2 有什么区别,我现在还不能了解。

  • 相关阅读:
    一起谈.NET技术,深入ASP.NET 2.0的提供者模型(2) 狼人:
    一起谈.NET技术,从.NET中委托写法的演变谈开去(上):委托与匿名方法 狼人:
    一起谈.NET技术,将Flash 嵌入WPF 程序 狼人:
    一起谈.NET技术,数组排序方法的性能比较(中):Array.Sort<T> 实现分析 狼人:
    人一生当中最应该珍惜的十种人
    《程序员的第一年》复习一下C#的【封装 多态 继承 简单计算器源码实例】
    myeclipse 修改模板
    三星将在百思买零售店内开设1400家体验店
    谷歌Q3推Android本 蚕食自己平板市场
    Spring Setting
  • 原文地址:https://www.cnblogs.com/woaixingxing/p/10838546.html
Copyright © 2020-2023  润新知