String.split()最详细源码解读及注意事项

简介: String.split()最详细源码解读及注意事项

前言

博主针对字符串分割时出现的各种空字符串问题,进入String类的源码看了一下,现作如下解读及演示:

一、split(regex,limit)

首先是带有两个参数的split方法:
在这里插入图片描述

作用:

将以给定正则表达式(regex)的字符串分隔开来

  • 第一个参数是传入字符类型的分隔符,如 "," 等(可以是任何字符串)
  • 第二个参数传入整型的limit,代表的是将此字符串分割成n部分(这里的n就是limit).

返回值:

此方法返回的数组包含此字符串的每个子字符串,这些子字符串以匹配到的正则表达式(就是以输入的第一个参数regex)作为结束,或由字符串的结尾作为结束。

注意事项:

  1. 数组中的子字符串按照它们在这个字符串中出现的顺序排列。
  2. 如果输入的regex不匹配字符串里面的任何字符,那么结果数组只有一个元素,即这个字符串。(就是若字符串里面没有出现输入的regex参数)
  3. 如果在字符串的开头有一个正数的匹配(就是字符串开头有>0个的regex分隔符),那么在结果数组的开头会包含一个空的前导子字符串.
public class test {
    public static void main(String[] args) {
        String str = ",,1,2,3,4"; // 注意这里字符串开头就匹配到了逗号
        String[] s = str.split(",",10);// 这里先取10,后文介绍第二个参数
        for (String string : s) {
            System.out.println("子字符串"+string);
        }
        System.out.println(s.length);
    }

}

==运行结果:==

第一个逗号前面会有出现一个空的子字符串

在这里插入图片描述

  1. limit参数控制应用模式的次数,因此会影响结果数组的长度。(这里的意思就是limit的取值控制了结果数组的长度)

在这里插入图片描述
对以上解读如下:

  • (1) 如果limit输入的是一个正数, 那么该模式将最多应用limit - 1次(==就是说只会用输入的regex去字符串里面匹配limit-1次==),数组的长度将不大于limit,并且数组的最后一个条目将包含最后一个匹配的分隔符之外的所有输入(==就是说他分隔的模式是从前逐个往后的==).给个代码便于大家理解:
public class test {
    public static void main(String[] args) {
        String str = "1,2,3,4";
        String[] s = str.split(",",2);//这里输入limit为2,即分成2部分
        for (String string : s) {
            System.out.println("子字符串"+string);
        }
        System.out.println(s.length);
    }

}

==运行结果:==

字符串被分隔成2个子字符串,分隔模式是从前往后的

在这里插入图片描述

  • (2) 如果输入的limit为,则模式将被应用尽可能多的次数,结果数组可以有任何长度,而尾部的空字符串将被丢弃. (==就是匹配字符串里面所有的regex分隔符==),关于空字符串被丢弃,代码如下:
public class test {
    public static void main(String[] args) {
        String str = "1,2,3,4,,,";// 这里后面逗号之间的空字符串将被丢弃
        String[] s = str.split(",",0);
        for (String string : s) {
            System.out.println("子字符串"+string);
        }
        System.out.println(s.length);
    }

}

==运行结果:==

尾部的空字符串将不会出现在结果数组里

在这里插入图片描述

  • (3) 如果输入limit的值为负数,则模式将被应用尽可能多的次数,数组可以有任何长度。(==尾部的空字符串也不会被丢失噢==)
public class test {
    public static void main(String[] args) {
        String str = ",1,2,3,4,";
        String[] s = str.split(",",-1);//limit值为负数
        for (String string : s) {
            System.out.println("子字符串"+string);
        }
        System.out.println(s.length);
    }

}

==运行结果:==

字符串的尾部空字符串不会被丢失

在这里插入图片描述

二、split(regex)

接下来只带有一个参数的split方法就容易了,就是默认limit的值为0.

在这里插入图片描述
该方法的工作原理就是用给定regex参数和一个limit参数默认为0来调用两个参数的split方法。因此,结果数组中不包含尾随的空字符串。

在这里插入图片描述

总结

以上就是对String类中split方法的源码解读以及所有的注意事项,纯手打,有帮助的话麻烦给个关注+点赞收藏哟♥♥♥

相关文章
|
1月前
|
存储 Java
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
|
21天前
|
存储 Java API
JavaSE——常用API(2/3)-String使用时的注意事项、String的应用案例
JavaSE——常用API(2/3)-String使用时的注意事项、String的应用案例
19 1
|
4天前
|
存储 缓存 安全
java源码之String详解
java源码之String详解
11 0
|
16天前
|
安全 Java 数据安全/隐私保护
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
20 0
|
16天前
|
JSON 安全 Java
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
29 0
|
1月前
qt初入门0:结构体中QString用memset导致崩溃分析及QLatin1String简单查看源码
qt初入门0:结构体中QString用memset导致崩溃分析及QLatin1String简单查看源码
101 0
|
1月前
|
安全 API
详解StringBuilder和StringBuffer(区别,使用方法,含源码讲解)
详解StringBuilder和StringBuffer(区别,使用方法,含源码讲解)
58 0
|
8月前
|
存储 安全 编译器
Go语言源码剖析-String和unsafe包
Go语言源码剖析-String和unsafe包
51 0
|
11月前
|
存储 消息中间件 缓存
从源码上聊聊Redis-String、List的结构实现
本文的数据类型只讲底层结构和部分机制,不讲具体的使用,使用的话自行bing,但是会提一些应用场景
147 1
从源码上聊聊Redis-String、List的结构实现
|
11月前
|
存储 安全 Java
高频面试题-JDK集合源码篇(String,ArrayList)
都是List的子集合,LinkedList继承与Dqueue双端队列,看名字就能看出来前者是基于数组实现,底层采用Object[]存储元素,数组中的元素要求内存分配连续,可以使用索引进行访问,它的优势是随机访问快,但是由于要保证内存的连续性,如果删除了元素,或者从中间位置增加了元素,会设计到元素移位的操作,所以增删比较慢。
61 0