分享一个 Java String split 快速分割的方法

时间:2022-08-29 19:18:21

java中string.split() 方法比较强大,但是split()方法采用正则表达式,速度相对会慢一点,

其实大多数场景下并不需要使用正则表达式,下面分享一个不使用正则表达式分隔字符串的方法。

方法保证了和 string.split()的输出结果一致。

直接看代码:

    public static String[] split(String src,String delimeter){
String srcStr = src;
String delimeterStr = delimeter;
if(srcStr==null){
return null;
}
if(delimeterStr==null){
throw new IllegalArgumentException("delimeter should not be null");
}
if(delimeterStr.equals("")){ //直接返回每个字符的字符串形式
String[] array = new String[srcStr.length()];
for(int i = 0;i<array.length;i++){
array[i] = String.valueOf(srcStr.charAt(i));
}
return array;
}
if (srcStr.length() > delimeterStr.length()) { //源字符串长度大于分隔符字符串长度
int i = srcStr.indexOf(delimeterStr);
int j = i;
int n = 0;
int lastIndex = srcStr.length() - delimeterStr.length();
boolean lastStringIsDelimeter = false;
while (i >= 0) {
n++;
i = srcStr.indexOf(delimeterStr, i + delimeterStr.length());
if (i == lastIndex) { // delimeter is the last string of the src, should not be counted
lastStringIsDelimeter = true;
break;
}
}
String[] array = new String[n + 1];
n = i = 0;
while (j >= 0) {
if (j - i > 0) {
array[n++] = srcStr.substring(i, j);
} else if (j - i == 0) { // two delimeter is neighbour
array[n++] = "";
}
i = j + delimeterStr.length();
j = srcStr.indexOf(delimeterStr, i);
}
if (!lastStringIsDelimeter) {
array[n] = srcStr.substring(i);
}
return array;
} else if (srcStr.length() == delimeterStr.length()) { // 源字符串长度等于 分隔符字符串长度
if (srcStr.equals(delimeterStr)) {
return new String[0];
} else {
String[] array = new String[1];
array[0] = srcStr;
return array;
}
} else { // 源字符串长度 小于 分隔符字符串长度 , 直接返回源字符串
String[] array = new String[1];
array[0] = srcStr;
return array;
}
}

测试代码:

        String src = "a.b.c.d.e.f.g.h.j.k.l.";
src = "a..b..c..d..e..f..g..h..j..k..l"; System.out.println("first-->");
long start = System.nanoTime();
String[] array = split(src, "..");
long end = System.nanoTime();
System.out.println("time:"+(end-start)+"ns");
System.out.println("size:"+array.length);
for(String s : array){
System.out.println(s);
}
System.out.println("<--end"); System.out.println("second-->");
long start1 = System.nanoTime();
String[] array2 = src.split("\\.\\.");
long end1 = System.nanoTime();
System.out.println("time:"+(end1-start1)+"ns");
System.out.println("size:"+array2.length);
for(String s : array2){
System.out.println(s);
}
System.out.println("<--end");

运行结果,可以看出,不采用正则表达式时,速度快了一些,当然此单次测试并不一定准确, 读者可以自己写一个多次循环求平均值的代码进行测试。

需要注意的是, 代码中并未加锁进行同步,因为此代码没有并发的问题,变量范围始终在局部变量表内,JVM中是线程独立的。

本人水平有限,如有问题,欢迎评论指正。

转载请注明出处。

分享一个 Java String split 快速分割的方法的更多相关文章

  1. java String&period;split&lpar;&rpar;函数的用法分析

    java String.split()函数的用法分析 栏目:Java基础 作者:admin 日期:2015-04-06 评论:0 点击: 3,195 次 在java.lang包中有String.spl ...

  2. Java String&period;split&lpar;&rpar;小点

    java String.split(); 别的不说,单说其中一个问题,这个函数去切分空字符串时,得到的结果: public static void main(String[] args) {// St ...

  3. Array和String测试与java&period;String&period;split

    java.string.split() 存在于java.lang包中,返回值是一个数组. 作用是按指定字符或者正则去切割某个字符串,结果以字符串数组形式返回. 例 String [] toSort = ...

  4. Java String Split Method

    Java String.split() method 有如下几种特殊情况: 1. 分隔符出现在首尾 public static void main(String args[]) { String St ...

  5. 分享一个解决MySQL写入中文乱码的方法

    分享一个解决MySQL写入中文乱码的方法 之前有发帖请教过如何解决MySQL写入中文乱码的问题.但没人会,或者是会的人不想回答.搜索网上的答案并尝试很多次无效,所以当时就因为这个乱码问题搁浅了一个软件 ...

  6. 分享一个解析XML成为php数组的方法

    原文:分享一个解析XML成为php数组的方法 <?php /* * To change this template, choose Tools | Templates * and open th ...

  7. Java 特殊字符的String&period;split的分割&lpar;&period; &bsol; &ast; &vert; &bsol;&bsol;&rpar;

    特殊字符 分割的时候使用: 关于点的问题是用 : String.split("[.]");   String..split("\\.") ; 关于竖线的问题用 ...

  8. Brief introduction to Java String Split 【简单介绍下Java String Split】

    Split is a common function in Java. It split a full string to an array based on delimeter. For examp ...

  9. 【转】java String&period;split&lpar;&rpar;函数的用法分析

      在java.lang包中有String.split()方法的原型是: public String[] split(String regex, int limit) split函数是用于使用特定的切 ...

随机推荐

  1. Track 造成Goldengate abended的那条record

    Email收到了这样的报错: 2016-12-07 02:52:22  WARNING OGG-01004  Aborted grouped transaction on 'MSP.USER_ACTI ...

  2. poj 2886 Who Gets the Most Candies&quest;(线段树和反素数)

    题目:http://poj.org/problem?id=2886 题意:N个孩子顺时针坐成一个圆圈且从1到N编号,每个孩子手中有一张标有非零整数的卡片. 第K个孩子先出圈,如果他手中卡片上的数字A大 ...

  3. awesome cpp

    https://github.com/fffaraz/awesome-cpp Awesome C/C++ A curated list of awesome C/C++ frameworks, lib ...

  4. win32下用VC扩展PHP全过程

    闲着无聊,打算开发一些PHP组件来玩玩,由于在家没有工作环境,遂打算在win32(我的环境是vista)用VC开发DLL模块,费话不 多说了,进入正题: 一.已经在机器上安装PHP环境的就略过,否则先 ...

  5. python面试题---收藏的笔记

    第一部分 Python基础篇(80题) 为什么学习Python? 通过什么途径学习的Python? Python和Java.PHP.C.C#.C++等其他语言的对比? 简述解释型和编译型编程语言? P ...

  6. 知识点:Mysql 索引原理完全手册(1)

    知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) Mysql-索引原理完全手 ...

  7. python 方法

    1.首先运行python交互模式 输入 python 2.定义一个有序的集合 相当于js中的数组它里面有一些增删改查的方法 1. 定义一个数组 >>> ww = ['1','2',' ...

  8. request 对于cookie,session&comma; json的处理

    一.cookie是存放在客户端,session是存放在服务端. 因为http是无状态的,当客户端发送请求给服务端的时候,服务端为了区分下一次发送请求的是不是同一个客户,那么就需要用一种方式记录下这个客 ...

  9. Android DevArt4:IntentFilter学习及深入~问题描述:在不指定具体action前提下,如果有两个以上的Activity,具有完全相同的intent-filter,项目同步是否会出现异常?程序运行是否会崩溃?

    概述:GitHub IntentFilter意图过滤器,三种匹配规则:action.category.data 重点:过滤规则中必须设置 '<category android:name=&quo ...

  10. &lbrack;原&rsqb;RHEL7&sol;Centos 7将网卡名称改为eth0

    ======问题===== rhel的网卡为enoxxxxxxxxx =====原因====== 从CentOS/RHEL7起,可预见的命名规则变成了默认.这一规则,接口名称被自动基于固件,拓扑结构和 ...