hello 大家好,好久不见,今天 我们要讨论的是java的split方法,或许你很早就知道了,但你真的知道吗?

我们来看看吧。

首先我们来看看我们最常用的split()方法也就是单个参数的方法

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

卧槽,这不是重载方法嘛,调用的是另外一个方法,而且还给了个默认值0,然后我们来看看重载的哪个方法

public String[] split(String regex, int limit) {
// Try fast splitting without allocating Pattern object
String[] fast = Pattern.fastSplit(regex, this,limit);
if (fast != null) {
return fast;
}
return Pattern.compile(regex).split(this, limit);
}

???这一串啥东西,不管了,既然这个方法的重载到此,我们就看看这个最底层的方法怎么用的吧

int limit?这是啥?以下为API解释

limit 参数控制模式应用的次数,因此影响所得数组的长度。如果该限制 n 大于 0,则模式将被最多应用 n - 1 次,数组的长度将不会大于 n,而且数组的最后一项将包含所有超出最后匹配的定界符的输入。如果 n 为非正,那么模式将被应用尽可能多的次数,而且数组可以是任何长度。如果 n 为 0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。

是不是有点活在自己世界的说法,没办法自己来试呗。

 注意:下面的测试请注意测试字符串的变化

1.默认方法测试,上面的代码可以看出,默认方法limit只是传的0而已。

废话不说,我们来上手测试 (注意我们的测试字符串最后一个逗号后面是空的

String str = "1,2,4,5,6,7,";
String[] strArr = str.split(","); for(String s: strArr){
System.out.println("分割:"+s);
}
System.out.println("数组长度:" + strArr.length);

输出结果:

分割:1
分割:2
分割:4
分割:5
分割:6
分割:7
数组长度:6

测试结果:按照理论分割的话,那么最后一个“,”后面的空不是也应该也被分割出来嘛,但是发现测试结果最后一个空格被去掉了,那么是省去了吗?

                  1.去掉最后一个空格不分割。

既然这样,那我拿多个空格在后面能去掉吗?

来测试

        String str = "1,2,4,5,6,7,,,";
String[] strArr = str.split(","); for(String s: strArr){
System.out.println("分割:"+s);
}
System.out.println("数组长度:" + strArr.length);

输出结果:

分割:1
分割:2
分割:4
分割:5
分割:6
分割:7
数组长度:6

测试结果:看来limit为0 时 分割的最后如果是空格,那么无论多少个空格都会被去掉

其他猜想:1.若中间出现空格会去掉吗? (如: 1,2,3,,4,5,6,7)

                  2.若开头出现空格会去掉吗? (如:,,1,2,3,4,5,6,7)

我就不贴代码了:1.中间的不会去掉空格,空格也会作为一个字符串存入分割后的数组中。

                             2.开头的空格也不会去掉,也做保留。

结论:当limit == 0 时,只有存在最后的空格会被去掉,其他的在中间和前面的都不会被去掉。

2.当limit > 0时 测试开始。

        String str = "1,2,4,5,6,7";
String[] strArr = str.split(",",5); for(String s: strArr){
System.out.println("分割:"+s);
}
System.out.println("数组长度:" + strArr.length);

输出结果

分割:1
分割:2
分割:4
分割:5
分割:6,7
数组长度:5

What ?   最后一个分割冒出了一个 "6,7" ?????啥玩意啊?

别急我们来看,这里的分割的个数是不是等于limit的填的数量?

果然 limit 等于 分割个数  那这个就简单了

测试结果:limit等于你要分割的份数。

其他猜想:1.如果limit > 最大分割的份数(比如 “1,2,3,4,5,6,7”最大的分割其实是7份,大于最大分割也就是大于7)会怎么样呢?

                  2.如果limit 是小数怎么办?  

结论:1.如果大于也只会按照最大的分割数分割。

           2.limit是整型,不能使用小数

2.当limit < 0时 测试开始。

        String str = "1,2,4,5,6,7,";
String[] strArr = str.split(",",-1); for(String s: strArr){
System.out.println("分割:"+s);
}
System.out.println("数组长度:" + strArr.length);

输出结果:

分割:1
分割:2
分割:4
分割:5
分割:6
分割:7
分割:
数组长度:7

哈哈看到了有意思的了,最后一个空格他没有屏蔽

后面也不买关子了

结论:如果limit为负数,就不会去掉任何分割后的字符,至于 -1 和-2 有什么区别,我现在还不能了解。

java学习笔记之String.Split方法的更多相关文章

  1. java学习笔记之String类

    String类总结 String类概述: java.lang.String 类是字符串操作类 String类的常用构造方法: //1.直接赋值 String str= "hellojava& ...

  2. Java学习笔记 02 String类、StringBuilder类、字符串格式化和正则表达式

    一.String类一般字符串 声明字符串 >>String str 创建字符串 >>String(char a[])方法用于将一个字符数组创建为String对象 >> ...

  3. 3.2常用类(java学习笔记)String与StringBuffer

    一.String String又称不可变字符序列. 我们看JDK源码中用于字符存储的数组有final修饰,final修饰变量就代表变量不能改变. 我们可以看API文档中对String的描述. Stri ...

  4. Java学习笔记五--String(二)String其他方法

    第一节课 // 清除单位字符串开始和结尾空白的副本 String.trim(); 字符串每次更改都会创建新的对象,而不会覆盖原来的字符串,每次拼接都会产生新的String对象,耗时耗内存. java. ...

  5. 0040 Java学习笔记-多线程-线程run()方法中的异常

    run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...

  6. 1.8(java学习笔记)继承与方法的重写

    继承 在java中可以通过继承提高代码的复用率. 例如A继承了B,就可以是 例如,首先有一个类似Person,这个类中有有一些属性和方法,我们再新建一个Student类,其中有一部分属性和方法与Per ...

  7. Java学习笔记(六)——方法

    一.方法定义 1.语法: 其中: (1) 访问修饰符:方法允许被访问的权限范围, 可以是 public.protected.private 甚至可以省略 ,其中 public 表示该方法可以被其他任何 ...

  8. 疯狂java学习笔记之面向对象(三) - 方法所属性和值传递

    方法的所属性: 从语法的角度来看:方法必须定义在类中 方法要么属于类本身(static修饰),要么属于实例 -- 到底是属于类还是属于对象? 有无static修饰 调用方法时:必须有主调对象(主语,调 ...

  9. Java学习笔记——设计模式之五.工厂方法

    水边一只青蛙在笑 --石头和水 工厂方法模式(Factory Method),定义了一个用于创建对象的接口,让实现类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 这里在简单和工厂的基础上 ...

随机推荐

  1. hdu 4826 Labyrinth DP

    题目链接:HDU - 4826 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向 ...

  2. JNuit

    s1:@Test s2:根据提示导包 s3:选中方法名,右击run as -->JUnit Test package songyan.jdbc.learn1; import org.junit. ...

  3. Android使用FFMpeg实现推送视频直播流到服务器

    背景 在过去的2015年中,视频直播页的新宠无疑是户外直播.随着4G网络的普及和覆盖率的提升,主播可以在户外通过手机进行直播.而观众也愿意为这种可以足不出户而观天下事的服务买单.基于这样的背景,本文主 ...

  4. VUE -- 自定义控件(标签)

    首先我们在 src目录下新建一个目录 叫”component”,建一个mycomponent.vue文件,然后也让他打2句话吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 ...

  5. 前端打包利器:webpack工具

    一.什么是WebPack,为什么要使用它? 1.为什要使用WebPack 现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包.为了简化开发的复杂度,前端 ...

  6. 新人补钙系列教程之:XML处理方法

    初始化XML对象XML对象可以代表一个XML元素.属性.注释.处理指令或文本元素.在ActionScript 3.0中我们可以直接将XML数据赋值给变量: var myXML:XML = <or ...

  7. SQL语言中的COMMENT添加字段的注释

  8. java gc log

    java full gc 经常带来延迟, 导致性能问题 如下命令使java虚拟机记录gc的log到文件, 帮助分析定位问题. java -Xloggc:./a.log -jar a.jar    // ...

  9. 转: 阿里跨平台移动开发工具Weex

    对于移动开发者来说,Weex主要解决了频繁发版和多端研发两大痛点,同时解决了前端语言性能差和显示效果受限的问题.开发者可通过Weex官网申请内测.(http://alibaba.github.io/w ...

  10. Linux下的非阻塞IO(一)

    非阻塞IO是相对于传统的阻塞IO而言的. 我们首先需要搞清楚,什么是阻塞IO.APUE指出,系统调用分为两类,低速系统调用和其他,其中低速系统调用是可能会使进程永远阻塞的一类系统调用.但是与磁盘IO有 ...