分享一个 Java String split 快速分割的方法
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 快速分割的方法的更多相关文章
- java String.split()函数的用法分析
java String.split()函数的用法分析 栏目:Java基础 作者:admin 日期:2015-04-06 评论:0 点击: 3,195 次 在java.lang包中有String.spl ...
- Java String.split()小点
java String.split(); 别的不说,单说其中一个问题,这个函数去切分空字符串时,得到的结果: public static void main(String[] args) {// St ...
- Array和String测试与java.String.split
java.string.split() 存在于java.lang包中,返回值是一个数组. 作用是按指定字符或者正则去切割某个字符串,结果以字符串数组形式返回. 例 String [] toSort = ...
- Java String Split Method
Java String.split() method 有如下几种特殊情况: 1. 分隔符出现在首尾 public static void main(String args[]) { String St ...
- 分享一个解决MySQL写入中文乱码的方法
分享一个解决MySQL写入中文乱码的方法 之前有发帖请教过如何解决MySQL写入中文乱码的问题.但没人会,或者是会的人不想回答.搜索网上的答案并尝试很多次无效,所以当时就因为这个乱码问题搁浅了一个软件 ...
- 分享一个解析XML成为php数组的方法
原文:分享一个解析XML成为php数组的方法 <?php /* * To change this template, choose Tools | Templates * and open th ...
- Java 特殊字符的String.split的分割(. \ * | \\)
特殊字符 分割的时候使用: 关于点的问题是用 : String.split("[.]"); String..split("\\.") ; 关于竖线的问题用 ...
- 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 ...
- 【转】java String.split()函数的用法分析
在java.lang包中有String.split()方法的原型是: public String[] split(String regex, int limit) split函数是用于使用特定的切 ...
随机推荐
- day6--面向对象初识
一面向过程与面向对象 面向过程: 流水线式的思维,顺着流程进行下去,类似于代码的堆叠,重视步骤 优点:不需要考虑太多东西,想到一个功能就写一个功能,堆叠代码 缺点:过程往往是先后执行的,要想变换功能或 ...
- fabric-network_setup.sh安装脚本分析
在进行镜像安装前,提供了一个sample脚本的下载,可以使用该脚本进行容器的启停.这里对该脚本进行分析. fabric/release/linux-amd64/network_setup.sh 脚本提 ...
- 输出单个文件中的前 N 个最常出现的英语单词,并将结果输入到文本文件中。程序设计思路。
将文件内容读取后存入StringBuffer中. 利用函数将段落分割成字符串,按(“,”,“.”,“!”,“空格”,“回车”)分割,然后存入数组中. 遍历数组,并统计每个单词及其出现的次数. 要求出文 ...
- UINavigationController 返回到各级目录
[self.navigationController popViewControllerAnimated:YES]; UINavigationController返回总结: 1.弹出当前视图控制器(弹 ...
- uva-10341-二分法
题意:已知方程的根在0-1范围内,求解方程的根,如果方程不存在根,那就输出 no solution. 直接二分,保留四位小数. #include "pch.h" #include ...
- CPU Usage Sampling Profiles (cpu=samples)
HPROF工具通过对采样线程搜集CPU使用信息.以下是从运行的javac中样例输出的一部分. $ javac -J-agentlib:hprof=cpu=samples Hello.java CPU ...
- python 求3到8位数的水仙花数Pycharm实现
#-*- coding: utf-8-*-import timeimport math#获取3位数的水仙花数start1 = time.time()start = time.time() number ...
- leetcode998
class Solution: def __init__(self): self.prelist = list() def preTree(self,root:TreeNode): if root ! ...
- Swoole 异步mysql使用
<?php class mysql { private $param; public $db; public function __construct() { $this->db = ne ...
- 图文详解AO打印(端桥模式)(转)
一.概述 AO打印是英文Active-Online Print的简称,也称主动在线打印.打印前支持AO通讯协议的AO打印机首先通过普通网络与C-Lodop服务保持在线链接,网页程序利用JavaSc ...