Java中字符串的split方法分析

本文详细分析了Java中String类的split()方法,重点讨论了三个limit参数情况下的行为:limit>0、limit=0和limit<0,解释了不同情况下返回的字符串数组长度和内容,以及空字符串处理规则。
摘要由CSDN通过智能技术生成

针对于相应的String类下的split()方法的分析

   @Test
    public void test12(){
        //自定义一个字符串
        String str = new String("52,5222sdf+jkl,03355s,,jkl, ,");
        //注意这里字符串最后是"",是分析的关键

        //同样还是这个数组
        //
        //第一种 limit>0
        System.out.println("1111111111");
        // limit > 0 ,则返回的字符串长度为 2 * (limit - 1),最后一个字符串,将包含最后一次分隔符所分割的后续所有的字符串。
        String[] newStr = str.split(",",2);
        for(int i = 0;i < newStr.length;i++){
            System.out.println(newStr[i]);
            if (newStr[i].equals("")) {
                System.out.println("null");
            }
        }

        //第二种 limit=0 ,返回字符串数组的长度不限制,但是最后一个尾随的空字符串会被抛弃 值得注意的是" "不算空字符串,匹配得到的
        // 最后一个空字符串""将被舍弃
        System.out.println("22222222222");
        String[] newStr1 = str.split(",",0); //
        for(int i = 0;i < newStr1.length;i++){
            System.out.println(newStr1[i]);
            if (newStr1[i].equals("")) {
                System.out.println("null");
            }
        }

        //第三种 limit<0  返回字符串数组的长度不限制,所有均会返回,包括最后一个""
        System.out.println("333333333");
        String[] newStr2 = str.split(",",-1);
        for(int i = 0;i < newStr2.length;i++){
            System.out.println(newStr2[i]);
            if (newStr2[i].equals("")) {
                System.out.println("null");
            }
        }
    }

考虑如上代码,其运行结果如下:

运行结构示意图
在这里插入图片描述

从上述运行结果结合下述源码注释可以得知:String 的split()方法的参数主要分为: 第一个参数为待检测的分隔符,第二个为limit限制参数。第一个参数很好理解,笔者就不在此赘述了。第二个参数limit需要根据各种情况来判断:

第一种情况

源码注释

limit>0 :则返回的字符串长度为 2 * (limit - 1),其中返回的的数组的最后一个字符串,将包含最后一次分隔符所分割的后续所有的字符串。对应如下代码

   String[] newStr = str.split(",",2);
        for(int i = 0;i < newStr.length;i++){
            System.out.println(newStr[i]);
            if (newStr[i].equals("")) {
                System.out.println("null");
            }
        }

相应返回的字符串数组newStr,包含的字符串长度是2(limit - 1) = 2(2-1) = 2个,最后一个字符串将包含第一次匹配后的后半部分,即第一个",“后的所有内容,即为"5222sdf+jkl,03355s,jkl, ,” 相应运行结果如下:**
在这里插入图片描述与分析结果相匹配。

第二种情况

源码注释
limit=0 :则返回的字符串长度为 任意长度,即匹配的所有长度,返回所有匹配完的结果,但值得注意的是,此时最后一个空字符串数组"",将被舍弃。
对应处理代码如下所示:

       //第二种 limit=0 ,返回字符串数组的长度不限制,但是最后一个尾随的空字符串会被抛弃 值得注意的是" "不算空字符串,匹配得到的
        // 最后一个空字符串""将被舍弃
        System.out.println("22222222222");
        String[] newStr1 = str.split(",",0); //
        for(int i = 0;i < newStr1.length;i++){
            System.out.println(newStr1[i]);
            if (newStr1[i].equals("")) {
                System.out.println("null");
            }
        }

此时返回结果应该是匹配的所有结果,不断拆分,直到拆不下去了。但最后一个空字符串将不被返回对应的输出结果为,为便于分析将相应的空字符串"",后面添加一个null:
“52”
“5222sdf+jkl”
“03355s”
null
“jkl”
" "
对应的输出结果为:
运行结果2
对比运行结果我们发现,相应的中间多了一个空行,这是为啥呢?
仔细分析如下代码:

        String[] newStr1 = str.split(",",0); //
        for(int i = 0;i < newStr1.length;i++){
            System.out.println(newStr1[i]);
            if (newStr1[i].equals("")) {
                System.out.println("null");
            }
        }

可以看出首先我们是println()分割后的字符,那么如果输出字符串为空字符串时,将会输出一个空行,这也是空行的由来。验证一下:运行如下代码:

    @Test
    public void test13(){
        System.out.println("*******");
        System.out.println("");
        System.out.println("********");
    }

输出为:
在这里插入图片描述
可知猜想正确,我们的分析也是正确的。

第三种情况

在这里插入图片描述
limit<0 返回字符串数组的长度不限制,所有匹配的内容均会返回,包括最后一个""
针对这个理解,我们输出的内容应该是
“52”
“5222sdf+jkl”
“03355s”

null
“jkl”
" "

null
相应输出结果为:
在这里插入图片描述
与我们相应的分析理解一致。也符合源代码注释的理解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值