Java 分割字符串的方法String.split()底层原理与使用

文章目录

  • split()底层原理
    • 1.举例说明
    • 2.split源码分析
    • 3.API原解
    • 4.regex参数API原解
    • 5.limit参数介绍
    • 6.结果的验证
    • 7.此方法的使用
  • split方法的使用
    • split用法
    • 分析
    • 参数解释—regex
    • 参数解释—limit
    • 不同limit值的情况下的split结果验证
  • 扩展

split()底层原理

1.举例说明

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,我也会在后面说

2.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.API原解

此方法返回的数组包含此字符串的每个子字符串,这些子字符串由给定表达式匹配的另一个子字符串终止,或在字符串结尾处终止,数组中的子字符串按它们在此字符串中出现的顺序排列,如果表达式与输入的任何部分都不匹配,则结果数组只有一个元素,即此字符串。

上面这段话你可能会很蒙,看一下下面的例子你就明白了

注意:(空字符串也是一个字符串)

4.regex参数API原解

将此字符串拆分为给定正则表达式的匹配项。

5.limit参数介绍

api是这样说的:
(1)limit参数控制应用模式的次数,因此影响结果数组的长度
(2)如果限制n大于零,则模式将最多应用n-1次,数组的长度将不大于n,数组的最后一项将包含最后一个匹配分隔符以外的所有输入
(3)如果n为非正数,则模式将被应用尽可能多次,并且数组可以具有任何长度
(4)如果n为零,则将尽可能多次应用该模式,数组可以有任何长度,并且将丢弃尾随的空字符串。

简单的理解为:
limit 参数通过控制分割次数从而影响分割结果
如果传入 limit (limit >0) 那么字符串最多被分割 limit -1 次,分割得到数组长度最大是 limit ,数组的最后一项将包含最后一个匹配分隔符以外的所有输入(这句话的解释看后面的例子,很重要)
如果 limit = -1 将会以最大分割次数分割
如果 limit = 0 将会以最大分割次数分割,但是分割结果会丢弃尾随的所有空字符串

6.结果的验证

(1)我们先介绍一下limit=0的时候

public class split {public static void main(String args[]) {String line = ",aa,bcd,eef,,ss,";String[] split = line.split(",",0);System.out.println(split.length);}
}

dubug之后
在这里插入图片描述
结果证明,尾随的空字符串被丢弃,那我们继续证明到底是不是所有的尾随字符串都被丢弃

上代码:

public class split {public static void main(String args[]) {String line = ",aa,bcd,eef,,ss,,";String[] split = line.split(",",0);System.out.println(split.length);}
}

dubug之后
在这里插入图片描述

果然,尽可能大的分割,最后的两个空字符串都被丢弃了

(2)limit=4的时候

public class split {public static void main(String args[]) {String line = ",aa,bcd,eef,,ss,,";String[] split = line.split(",",4);System.out.println(split.length);}
}

dubug之后
在这里插入图片描述
结果验证了上面的那句话数组的最后一项将包含最后一个匹配分隔符以外的所有输入
因为最多分割limit-1次,所以找到分割到第三次时的",",包含后面的所有输入
在这里插入图片描述

(3)limit=-1的时候

public class split {public static void main(String args[]) {String line = ",aa,bcd,eef,,ss,,";String[] split = line.split(",",-1);System.out.println(split.length);}
}

dubug之后
在这里插入图片描述
结果证明 limit = -1 将会以最大分割次数分割

7.此方法的使用

如果用“.”作为分隔的话,必须是如下写法:String.split(“\.”),这样才能正确的分隔开,不能用String.split(“.”);
2、如果用“|”作为分隔的话,必须是如下写法:String.split(“\|”),这样才能正确的分隔开,不能用String.split(“|”);
“.”和“|”前面必须加\才可以起到转义的作用。
3、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“a=1 and b =2 or c=3”,把三个都分隔出来,可以用String.split(“and|or”);

我们来看个例子:

String words[]=str.split("\\s+|\\."); 

这个是很么意思呢?
使用一个或多个空格分隔和用逗号分隔

解释如下:
s表示 空格,回车,换行等空白符
+号表示一个或多个的意思
|表示分隔符
使用的时候记得加上两个斜杠哦



split方法的使用

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,我也会在后面说

分析

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) {具体实现...}

参数解释—regex

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

参数解释—limit

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

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

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

limit=0,regex=“,”
尾部的逗号,直接被忽略,头部的逗号不会忽略

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

limit=2,regex=“,”
总长度被限制成最大2个

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

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

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

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

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

扩展

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

		<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>24.1-jre</version></dependency>
12345
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,即头部逗号没有被忽略,而尾部逗号是被忽略的

一定要注意区分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HttpClient使用和详解

文章目录一、关于HttpClient二、HttpClient使用步骤详解1、创建一个HttpClient对象A、HttpCLientConnectionManagerB、HttpRoutePlannerC、RequestConfig2、创建一个Request对象3、执行Request请求4、处理response1&#xff09;关闭和entity相关的content stream2&#xff09;关…

你还在 Docker 中跑 MySQL?

容器的定义&#xff1a;容器是为了解决“在切换运行环境时&#xff0c;如何保证软件能够正常运行”这一问题。 目前&#xff0c;容器和 Docker依旧是技术领域最热门的词语&#xff0c;无状态的服务容器化已经是大势所趋&#xff0c;同时也带来了一个热点问题被大家所争论不以&…

使用mybatis-plus来自定义排序

需求&#xff1a; 先时间升序排序&#xff0c;相同的时间在按状态排序&#xff0c;状态的顺序为1 在线 4 潜伏 2 隐身 3 离开&#xff0c;状态相同在按姓名升序排序对排序好的数据进行分页运用mybatis-plus中QueryWrapper 1.导入依赖 <dependencies><dependency>…

Postman实现接口测试(附项目实战)

文章目录Postman实现接口测试1.Postman介绍和安装2. Postman安装2.1 安装方式2.2 安装步骤3. Postman入门示例Postman基本用法Postman高级用法1. 管理用例2. Postman断言3. 全局变量与环境变量5. Postman关联6. 批量执行测试用例7. 读取外部文件实现参数化Postman测试报告目标项…

Postman 使用教程详解

Postman页面 2、新建一个项目 直接点击左边栏上面的添加目录图标来新增一个根目录&#xff0c;这样就等于新建了一个项目&#xff0c;我们可以把一个项目或一个模块的用例都存放在这个目录之下&#xff0c;并且在根目录之下我们还可以在建立子目录来进行功能用例的细分&#…

Springboot dubbo @Service @Transactional 无法提供服务或者无法提供事务的解决办法

问题场景&#xff1a; 今天在springboot中集成spring事务的时候&#xff0c;遇到了一个大坑。如果&#xff08;springbootdubbo&#xff09;中添加 Service、Transactional 两个注解的时候&#xff0c;就不能进行dubbo服务注册了。 解决历程&#xff1a; 1&#xff0c;先是在…

什么是 serialVersionUID ? 序列化对象时必须提供 serialVersionUID 吗?

什么是 serialVersionUID &#xff1f; 序列化对象时必须提供 serialVersionUID 吗&#xff1f; 1&#xff0c;什么是 serialVersionUID &#xff1f; 顾名思义&#xff0c;serialVersionUID是序列化版本号。所有可序列化的类&#xff0c;都有一个静态serialVersionUID属性&a…

谈Java集合类的toArray()的小bug

谈Java集合类的toArray()的小bug toArray()方法 它的作用是将集合转换成数组。但是这个方法有一个弊端&#xff0c;当toArray()方法使用不当时会产生ClassCastException&#xff08;类转换异常&#xff09; public static void main(String[] args) {List<Integer> li…

Dubbo系统里面MultipartFile文件传输问题Dubbo文件上传/传输服务

今天遇到一个问题&#xff0c;在Controller 层里面&#xff0c;直接使用MultipartFile 来接收上传的图片&#xff0c;遇到几个坑。 一、在spring配置文件里面配置文件上传 <!--文件上传--><bean name"multipartResolver"class"org.springframework.web…

Dubbo2.7文档详解

本篇博文参考dubbo官方文档 本编博文参考javaguide之rpc 文章目录一.RPC1.1 什么是 RPC?1.2 为什么要用 RPC?1.3 RPC 能帮助我们做什么呢&#xff1f;1.4 RPC 的原理是什么?1.5 常见的 RPC 框架总结二.既有 HTTP ,为啥用 RPC 进行服务调用?2.1 RPC只是一种设计而已2.2 HTTP…

12nm 制程、Zen+ 微架构 AMD Ryzen 7 2700X 处理器详细测试 - 电脑领域 HKEPC Hard

12nm 制程、Zen 微架构 AMD Ryzen 7 2700X 处理器详细测试 代号 Pinnacle Ridge、AMD 第二代 Ryzen 处理器正式登场&#xff0c;基于经改良的 Zen 微架构&#xff0c;改善了 Cache 及记忆体延迟表现&#xff0c;更先进的 12nm LP 制程&#xff0c;令核心时脉进一步提升&#…

Java之Serializable接口实现序列化和反序列化实例以及部分序列化的四种方法

首先需要明确的概念: 序列化&#xff1a;将数据结构或对象转换成二进制字节流的过程反序列化&#xff1a;将在序列化过程中所生成的二进制字节流的过程转换成数据结构或者对象的过程持久化&#xff1a;将数据写入文件中长久保存的过程称之为持久化序列化主要目的&#xff1a;是…

win10死机频繁怎么解决

Windows 10已经推出好几年&#xff0c;系统趋于稳定&#xff0c;但依旧不是完美&#xff0c;蓝屏、死机状态还是会出现&#xff0c;只是概率降低了很多&#xff0c;如果你的电脑遇到了突然死机或者频繁卡死的情况&#xff0c;或许你应该考虑对电脑进行重置了。系统自带的恢复重…

Jar包常见的反编译工具介绍与使用

反编译JAR能干什么: 排查问题、分析商业软件代码逻辑&#xff0c;学习优秀的源码思路。 反编译工具介绍 JD-GUI 下载地址&#xff1a;http://java-decompiler.github.io/ 点评&#xff1a;支持的java版本不会太高&#xff0c;中文注释能够正常显示。 Luyten 下载地址&#…

400 bad request的原因意思和解决方法

我们的电脑在使用的过程中&#xff0c;有的小伙伴在上网的时候可能就遇到过系统提示&#xff1a;400 bad request的情况。据小编所知这种情况&#xff0c;大致意思就是出现了错误的请求或者请求不能满足。原因是因为我们请求的语法格式出现呢错误或者其他情况等等。我们可以通过…

重装系统win10提示磁盘布局不受UEFI固件支持怎么办

原因分析&#xff1a; Win10系统新增UEFI检测机制&#xff0c;在BIOS开启了UEFI时&#xff0c;如果硬盘分区表格式不是GPT&#xff0c;则会提示无法重装系统win10&#xff0c;也就是说UEFIGPT或LegacyMBR才能安装win10。 解决方法一&#xff1a;关闭UEFI 1、重启系统时按Del…

win7按f8后没有进入安全模式怎么解决

win7f8后没有进入安全模式&#xff0c;在正确操作按F8没有进入安全模式之后&#xff0c;不知道怎么解决win7按f8后没有进入安全模式怎么解决&#xff0c;其实非常的简单&#xff0c;下面来看看详细的解决方法吧。 win7按f8后没有进入安全模式怎么解决 第一种方法&#xff1a;…

电脑开机就进入bios的解决方法

最近很多人反映自己的电脑一开机就直接进入bios里&#xff0c;无法正常进入系统。这是怎么回事呢?开机进入bios无法进入系统怎么办呢?别着急&#xff0c;今天就为大家带来电脑开机就进入bios的解决方法。 电脑开机就进入bios的解决方法&#xff1a; 1、如果是电脑的硬盘出了…

Serializable序列化和Externalizable序列化与反序列化的使用

1、序列化是干啥用的&#xff1f; 序列化的原本意图是希望对一个Java对象作一下“变换”&#xff0c;变成字节序列&#xff0c;这样一来方便持久化存储到磁盘&#xff0c;避免程序运行结束后对象就从内存里消失&#xff0c;另外变换成字节序列也更便于网络运输和传播&#xff…

Win10系统如何查看电脑是否是UEFI启动模式

Win10系统如何查看电脑是否是UEFI启动模式?现在越来越多的新电脑都采用UEFI来引导电脑系统&#xff0c;UEFI提高了开机后操作系统的启动速度&#xff0c;使电脑更加流畅&#xff0c;安全性更强&#xff0c;而传统的BIOS则没有UEFI用起来那么好。如何查看自己Win10系统电脑是否…