浅析Java中的字符串分割方法split()

本文探讨了Java中字符串分割方法split(),通过代码示例分析了split()的第二个int类型参数limit的作用。当limit>0,最多分割limit-1次;limit<0时,尽可能多分割;limit=0时,丢弃最后的空字符串。提醒读者在处理空字符串时要注意其行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天看到同事代码里有类似如下这样一行代码:

String[] testStrs3 = testStr3.split(",", -1);

因为之前使用split()方法没有加过第二个参数,所以对此进行了学习,在此做个总结与分享。

1.代码示例

先来看一段测试代码:

public class Test {
	
	public static void main(String[] args) {
		String testStr = ",aa,bb,cc,";
		
		//情形1: split(String)
		String[] testStrs1 = testStr.split(",");
		printArray(testStrs1, 1);
		
		//情形2: split(String, int)
		String[] testStrs2 = testStr.split(",", 0);
		printArray(testStrs2, 2);
		
		
		//情形3: split(String, int)
		String[] testStrs3 = testStr.split(",", -1);
		printArray(testStrs3, 3);
		
		//情形4: split(String, int)
		String[] testStrs4 = testStr.split(",", 2);
		printArray(testStrs4, 4);
		
	}
	
	private static void printArray(String[] testStrs, int index) {
		System.out.println("情形[" + index + "]打印开始");
		for (String str : testStrs) {
			System.out.println(str);
		}
		System.out.println("情形[" + index + "]打印结束");
		System.out.println();
	}
}

运行结果:

情形[1]打印开始

aa
bb
cc
情形[1]打印结束

情形[2]打印开始

aa
bb
cc
情形[2]打印结束

情形[3]打印开始

aa
bb
cc

情形[3]打印结束

情形[4]打印开始

aa,bb,cc,
情形[4]打印结束

从打印结果来看,同一个字符串,使用同一个方法split()来分割,但结果差异还是比较大的,下面分析一下split()的第二个int类型参数的作用。

2.方法解析

在String类中,split()方法有两种实现,方法签名如下:

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

从源码中可以看到,其实第一个方法是基于第二个方法实现的,只是limit参数默认为0

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

所以,上面提出的问题就可以归结到limit参数了。下面是split()方法注释中对limit参数的说明:
在这里插入图片描述
可以看到:

  1. limit>0时,字符串最多会被分割limit-1次,即最后得到长度为limit的数组。如果字符串包含多于limit-1个分隔符,那么从第limit-1个分隔符到最后的子字符串将被当成一个字符串放到分割后的字符串数组的最后;
  2. limit<0时,字符串会被分割尽可能多的次数;
  3. limit=0时,字符串也将被分割成尽可能多的次数,不同的是最后的空字符串会被丢弃。

看到上面注解后,也就明白上面代码打印不同结果的原因了。情形1和情形2其实同属于limit为0的情况,所以分割后最后的空字符串被丢弃,但是第一个空字符串会保留;情形3为limit小于0的情况,所以最后的空字符串也不会被丢弃;情形4是limit大于0的情况,所以字符串只被分割了limit-1即2-1=1次,最后得到的字符串数组之后两个元素。

3.提醒

当对于一个空字符串进行分割时,不管limit参数为何,最后结果都是得到一个只包含一个空字符串的(长度为1)的字符串数组,这个有时候需要注意。

4.结语

以上内容如有错误之处,敬请指正,不胜感激。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值