String的split方法的使用

1.引言

split方法很常用,记得我入职公司的时候,第一道笔试题就是关于字符串的拆分拼装等,这也足以说明,大公司对这些方法的重视程度.

其实我们平时一般用到的都是这些方法最简单的用法,但如果你不了解他的实现原理,碰到某些特殊问题终究是会被卡住的,于是就产生了所谓的bug,而这也就是大神和菜鸟的区别之一吧.广度是一方面,但真正看一个程序员是不是牛逼,重要的还是看他的深度,比如这个split的用法,如果你还停留在简单的用法上,不妨看看后面,也看看你的深度,与君共勉!

2.split用法

先上一个例子:

1.最普通的用法
		String str1 = "aa,bb";
		String[] split1 = str1.split(",");
		System.out.println(split1.length);
		//这个结果是2,都知道的
2.比较普通的用法
		String str2 = "";
		String[] split2 = str2.split(",");
		System.out.println(split2.length);
		//这个结果是1,但部分人会认为这个的结果是0,
		//这个为什么是1,我会在后面说
3.看起来比较奇怪的用法
		String str3 = ",";
		String[] split3 = str3.split(",");
		System.out.println(split3.length);
		//这个结果是0,但部分人会认为结果是1,部分人会认为结果是2.
		//这个又为什么是0,我也会在后面说

3.split源码分析

split方法准确的来说有两个参数(String regex, int limit),只不过平时我们用的,是split的一个重载方法(String regex),默认是把第二个参数设置为0,源码如下:

	public String[] split(String regex) {
        return split(regex, 0);
    }
    
    public String[] split(String regex, int limit) {
		具体实现...
	}

3.1.参数解释—regex

1.如果表达式不匹配输入的任何内容,返回的数组只具有一个元素,即此字符串。(尤其注意空字符串这种情况,他也是一个字符串)
2.可以匹配的情况下,每一个字符串都由另一个匹配给定表达式的子字符串终止,或者由此字符串末尾终止(数组中的字符串按照他们在此字符串出现的顺序排列)

3.2.参数解释—limit

该参数用于控制模式匹配使用的次数,可以影响到数组的长度
1.limit>0:
模式匹配将被最多应用n-1次,数组的长度将不会大于n,数组的最后一项将包含所有超出最后匹配的定界符的输入。
2.limit<0:
模式匹配将应用尽可能多的次数,而且数组的长度是任何长度。
3.lilmit=0:
模式匹配将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。

3.3.不同limit值的情况下的split结果验证

假设有字符串aa,bcd,eef,

3.3.1.limit=0,regex=","
尾部的逗号,直接被忽略,头部的逗号不会忽略

String line = ",aa,bcd,eef,,,";
String[] split = line.split(",",0);
System.out.println(split.length);//4

3.3.2.limit=2,regex=","
总长度被限制成最大2个

String line = ",aa,bcd,eef,,,";
String[] split = line.split(",",2);
System.out.println(split.length);//2

3.3.3.limit=100,regex=","
总长度被限制成最大100个
但结果是7个,说明当limit大于0,并且远大于应该有的长度时,头部和尾部的逗号都没有被忽略

String line = ",aa,bcd,eef,,,";
String[] split = line.split(",",100);
System.out.println(split.length);//7

3.3.4.limit=-1,regex=","
结果是7个,说明当limit小于0时,头部和尾部的逗号都没有被忽略

String line = ",aa,bcd,eef,,,";
String[] split = line.split(",",100);
System.out.println(split.length);//7

4.扩展

谷歌的guava包,也有对split的重写,返回的是list数组集合.
具体使用如下:

		<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>24.1-jre</version>
        </dependency>
String line = ",aa,bcd,eef,,,";
List<String> split2 = Splitter.on(",").splitToList(line);
System.out.println(split2.size());//7

根据结果,我们可以看到,谷歌的split默认是头部和尾部的逗号都没有被忽略,相当于java包下split的limit设置为-1

相比下,java包下split的limit默认不写就是0,即头部逗号没有被忽略,而尾部逗号是被忽略的

一定要注意区分

  • 39
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值