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,一经查实,立即删除!

相关文章

MySQL中数据类型的长度问题解析

MySQL中数据类型的长度问题总结 1&#xff09;&#xff1a;int类型&#xff0c;对吧&#xff0c;经常像保存个时间戳啊、id啊、数量啊、排序啊都会用到 提问&#xff1a;INT&#xff08;11&#xff09;是什么意思&#xff1f;最大保存十一位数么&#xff1f; 回答&#xff1a;…

HttpComponents入门解析

1 简介 超文本传输协议(http)是目前互联网上极其普遍的传输协议&#xff0c;它为构建功能丰富&#xff0c;绚丽多彩的网页提供了强大的支持。构建一个网站&#xff0c;通常无需直接操作http协议&#xff0c;目前流行的WEB框架已经透明的将这些底层功能封装的很好了&#xff0c…

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;并且在根目录之下我们还可以在建立子目录来进行功能用例的细分&#…

聊聊@Autowired注解注入,写接口名字还是实现类的名字

用Autowired注解注入,写接口名字还是实现类的名字 来自某程序员一个问答问题 有一点没明白&#xff0c;为什么注解repository注解的是接口UserDAO的实现类UserDAOImpl&#xff0c;而在UserServiceImpl中使用Autowired注解注入属性private UserDAO userDAO自动装配&#xff0c…

Spring注入接口还是实现类,同一接口有多个实现类,如何注入

1、接口&#xff1a;IUserService public interface IUserService {public void sayHello(); }2、实现类&#xff1a;UserServiceImpl&#xff0c;实现了UserService接口 Service("UserServiceImpl ") public class UserServiceImpl implements IUserService{// 添…

Spring只能注入接口,不能注入实现类

只能注入接口&#xff0c;不能注入实现类。 Controller public class Test {AutowiredprivateRoleDao rdi; }privateRoleDao是个接口 这样注入就没有问题&#xff0c; 而注入 Controller public class Test {AutowiredprivateRoleDaoImpl rdi; }会报错&#xff1a;No qua…

调用Dubbo报错: com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method 问题原因和解决办法

我们在使用Dubbo的过程中&#xff0c;时常会碰到这个异常。而有可能导致这个异常的原因是非常多的&#xff0c;排查起来比较困难。下面把如何排查该问题的思路整理了一下&#xff0c;目前我知道的会导致这个异常的原因分为以下几类&#xff1a; 1.需要进行序列化的POJO类没有进…

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

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

Dubbo序列化

Dubbo序列化 dubbo作为一个rpc框架支持丰富的序列化方式&#xff0c;本文简单介绍dubbo的序列化。本文结构&#xff1a; 对象序列化是什么意思&#xff1f;dubbo序列化几个问题 对象序列化是什意思&#xff1f; 先来思考两个问题&#xff1a; 普通的Java对象的生命周期是仅…

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

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

【Dubbo学习系列】Dubbo消费端的代理生成详解(@DubboReference和@Reference)

文章目录Spring中Dubbo实现RPC如何加载Reference和DubboReference注解DubboComponentScanRegistrar概括发现Refrence和DubboReference注解&#xff0c;并编织RPC通信逻辑ReferenceAnnotationBeanPostProcessor&#xff08;核心&#xff09;ReferenceDubboReferenceReference和D…

【Java编程】之 List 与数组之间的相互转换Arrays.asList 和 ArrayList 的 subList

文章目录一、数组转换成 List 集合二、List 集合转数组浅谈 Arrays.asList1、不能往 Arrays.asList 生成的 List 集合中添加元素Arrays.asList 只是简单的充当转换接口二、浅谈 ArrayList 的 subList1、subList 索引的取值边界2、subList 不可强转成 ArrayList3、对 subList 的…

谈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;令核心时脉进一步提升&#…