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,即头部逗号没有被忽略,而尾部逗号是被忽略的

一定要注意区分

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

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

相关文章

ReactiveCocoa入门

概述 为什么要使用RAC&#xff1f;一个怪怪的东西&#xff0c;从Demo看也没有让代码变得更好、更短&#xff0c;相反还造成理解上的困难&#xff0c;真的有必要去学它么&#xff1f;相信这是大多数人在接触RAC时的想法。RAC不是单一功能的模块&#xff0c;它是一个Framework&am…

[前台]---input标签中的hidden,浏览器差异问题

前言: 这是一个比较简单的问题,也有人犯过这样的错误,如果你是一个人在编码,并且没有专门的去测试浏览器差异,这个或许会坑到你 问题描述: 用input标签的时候,需要把这个input隐藏掉,于是先这样做: <input hidden id"xxx" value"xxx"/> 这行代码…

C++和Objective-C混编(官方文档翻译)

苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C和Objective-C&#xff0c;混编后的语言叫Objective-C。有了它&#xff0c;你就可以在Objective-C应用程序中使用已有的C类库。 Build Setting中要设定编译文件类型设置&#xff0c;如下图&#xff1a;Objectiv…

SpringMVC获取response的问题

SpringMVC获取response的问题: 关于用以下这种方式获取response的一些问题: ((ServletWebRequest) RequestContextHolder.getRequestAttributes()).getResponse(); 网上对于这种方式获取response的描述很多,我用的是jar包版本是3.2.9.release web.xml中肯定也是加了Request…

BigDecimal的个人总结

前言: 互联网公司,对于BigDecimal的使用,还是较为频繁的,那么就会涉及到关于这个类型的种种问题. 1:为什么使用BigDecimal 首先java八大基本类型真的很基本,4个整型搞不了小数,double和float搞的了小数,但搞不好,关键时刻就调链子,当然这也和他们存储方式有关(二进制无法精确的…

MagicRecord For IOS API深层解析

一、NSManagedObjectContext创建和获取1.默认上下文(每种只存在一个)&#xff08;1&#xff09;MR_rootSavingContext&#xff1a;此方法返回的上下文类型为NSPrivateQueueConcurrencyType(后台线程)&#xff0c;直接关联持久化协调器&#xff0c;对此上下文对象执行保存方法&a…

BeanUtils.copyProperties(对象A,对象B)

对于两个实例的复制,如果属性名字相同,则可以通过这个方法来操作,但是在使用的时候,一定要注意BeanUtils用的是哪个包的,因为常用的两个包,都有这个类和对应的方法,而复制方向却相反,所以一定要注意自动导包时选择的包!!!!!! 1.import org.springframework.beans.BeanUtils 这…

Xcode中的-ObjC和-all_load

有时候使用第三方库的时候&#xff0c;需要在Xcode的Build Settings下Other Linker Flags里面加入-ObjC标志。 之所以使用该标志&#xff0c;和Objective-C的一个重要特性&#xff1a;类别&#xff08;category)有关。根据这里的解释&#xff0c;Unix的标准静态库实现和Object…

[前台]---ajax返回200成功,却进入error函数的解决方法

最近碰到一个问题,就是如题目所说,ajax在调用的时候,明明返回成功了,但js代码却走到了error中,最后发现是我返回的json格式不对,jQuery在1.4后,对ajax返回的json格式有了很强的限制,所以一定要用严格的JSON格式返回. 先上代码: jQuery.ajax({type: "POST",async: tr…

SpringMVC解决静态资源不能访问

解决: 直接在SpringMVC的xml文件中加一行配置: <mvc:default-servlet-handler/> 问题根源: 做项目迁移的时候,原来控制层的框架是Struts2,现在要换成SpringMVC,第一版是尽量少改动的移过去,保证功能都正常,第二版开始优化,于是: 原来项目的访问都是XXX.action,现在想…

CocoaPods版本升级

和往常一样使用CocoaPods管理一个基于FMDB的项目类库 命令行执行 $ pod install [!] The master repo requires CocoaPods 0.32.1 - 失败&#xff0c;提示需要CocoaPods 0.32.1版本 查看CocoaPods版本 $ pod --version 0.29.0 确实需要更新了 命令行更新&#xff08;安装&…

[前台]---js获取input标签中name相同的各个value值

在页面form表单中,经常会有相同name的多个input标签,在提交表单前需要对这些input的value值做校验,就要在js中拿到这些值,下面这个方法,亲测是最实在的: 页面:<input type"hidden" name"myname" value"aa"/><input type"hidden&qu…

Objective-C消息转发

我们要通过一个小例子来简单、通俗的理解一下什么是消息转发以及如何消息转发&#xff0c;希望看完这篇文章时大家会彻底的明白OC的消息。首先&#xff0c;你需要知道这两个概念&#xff1a; OC中调用方法就是向对象发送消息。 比如 &#xff1a; 1[person run];这实际上这是在…

[前台]---js中方法的强制返回和java中方法的强制返回

java写惯了,偶尔写个js,真是各种坑,比如方法中的return的效果就不一样: java中: public static void main(String[] args) {String[] a {"1","2","3"};for (String s : a) {if(s.equals("1")){System.out.println(s);return;//方法中…

Create groups 与 Create folder references的区别

选择了Create groups方式添加了一个文件&#xff0c;我们会发现被添加进来的文件&#xff0c;文件夹是黄色的。选择了 Create folder references方式添加进来的文件的文件夹是蓝色的。那么两种方式有什么区别呢&#xff1f; 1.使用Create groups 为任何新增加的文件夹创建组&a…

[前台]---js重复上传一张图片两次,第二次失败的解决办法和思路

js重复上传一张图片两次,第二次会失败,解决办法就是修改input的value值. 先上代码: <input style"display:none" type"file" id"aaa" onchange"newuploadImageForDetail(event)" accept"image/jpg, image/jpeg, image/gif, …

XMPP协议简介

XMPP是一种基于标准通用标记语言的子集XML的协议&#xff0c;它继承了在XML环境中灵活的发展性。因此&#xff0c;基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求&#xff0c;以及在XMPP的顶端建立如内容发布系统和基于地址的服…

[前台]---关于input标签的value值

碰到这个情况,先上代码: <input type"hidden" id"input-shoppingListType" value0/> 这样写的话,最终在获取value的值的时候,平时都是0,直到有一次成了’0/’,发现了吗?把后面的斜杠也给拿到了,最终导致报错了 结果: <input type"hidde…

布尔类型(boolean/Boolean)自动生成的get方法需要注意的小细节

idea会自动生成get/set方法的, 对于布尔类型,要非常注意生成的get方法,到底是is开头还是get开头. 先说结论: 1.Boolean类型,生成的get方法是get开头的(建议使用这个). 2.boolean类型,生成的get方法是is开头的(用这个最好重写getXxx()格式的方法). 以下这个例子,可以验证这…

[前台]---js中去掉双引号或者单引号

在js中有这么一种情况,就是需要在function中动态的给标签加属性值,这时候如果带有引号,可能会导致加的属性值不是想要的,这时只需要去掉引号就可以,建议用下面这个: var a "双引号字符串"; a a.replace("\"","").replace("\"&q…