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

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

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

直接看代码:

  1. public static String[] split(String src,String delimeter){
  2. String srcStr = src;
  3. String delimeterStr = delimeter;
  4. if(srcStr==null){
  5. return null;
  6. }
  7. if(delimeterStr==null){
  8. throw new IllegalArgumentException("delimeter should not be null");
  9. }
  10. if(delimeterStr.equals("")){ //直接返回每个字符的字符串形式
  11. String[] array = new String[srcStr.length()];
  12. for(int i = 0;i<array.length;i++){
  13. array[i] = String.valueOf(srcStr.charAt(i));
  14. }
  15. return array;
  16. }
  17. if (srcStr.length() > delimeterStr.length()) { //源字符串长度大于分隔符字符串长度
  18. int i = srcStr.indexOf(delimeterStr);
  19. int j = i;
  20. int n = 0;
  21. int lastIndex = srcStr.length() - delimeterStr.length();
  22. boolean lastStringIsDelimeter = false;
  23. while (i >= 0) {
  24. n++;
  25. i = srcStr.indexOf(delimeterStr, i + delimeterStr.length());
  26. if (i == lastIndex) { // delimeter is the last string of the src, should not be counted
  27. lastStringIsDelimeter = true;
  28. break;
  29. }
  30. }
  31. String[] array = new String[n + 1];
  32. n = i = 0;
  33. while (j >= 0) {
  34. if (j - i > 0) {
  35. array[n++] = srcStr.substring(i, j);
  36. } else if (j - i == 0) { // two delimeter is neighbour
  37. array[n++] = "";
  38. }
  39. i = j + delimeterStr.length();
  40. j = srcStr.indexOf(delimeterStr, i);
  41. }
  42. if (!lastStringIsDelimeter) {
  43. array[n] = srcStr.substring(i);
  44. }
  45. return array;
  46. } else if (srcStr.length() == delimeterStr.length()) { // 源字符串长度等于 分隔符字符串长度
  47. if (srcStr.equals(delimeterStr)) {
  48. return new String[0];
  49. } else {
  50. String[] array = new String[1];
  51. array[0] = srcStr;
  52. return array;
  53. }
  54. } else { // 源字符串长度 小于 分隔符字符串长度 , 直接返回源字符串
  55. String[] array = new String[1];
  56. array[0] = srcStr;
  57. return array;
  58. }
  59. }

测试代码:

  1. String src = "a.b.c.d.e.f.g.h.j.k.l.";
  2. src = "a..b..c..d..e..f..g..h..j..k..l";
  3.  
  4. System.out.println("first-->");
  5. long start = System.nanoTime();
  6. String[] array = split(src, "..");
  7. long end = System.nanoTime();
  8. System.out.println("time:"+(end-start)+"ns");
  9. System.out.println("size:"+array.length);
  10. for(String s : array){
  11. System.out.println(s);
  12. }
  13. System.out.println("<--end");
  14.  
  15. System.out.println("second-->");
  16. long start1 = System.nanoTime();
  17. String[] array2 = src.split("\\.\\.");
  18. long end1 = System.nanoTime();
  19. System.out.println("time:"+(end1-start1)+"ns");
  20. System.out.println("size:"+array2.length);
  21. for(String s : array2){
  22. System.out.println(s);
  23. }
  24. System.out.println("<--end");

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

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

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

转载请注明出处。

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

  1. java String.split()函数的用法分析

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

  2. Java String.split()小点

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

  3. Array和String测试与java.String.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.split的分割(. \ * | \\)

    特殊字符 分割的时候使用: 关于点的问题是用 : 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.split()函数的用法分析

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

随机推荐

  1. [UGUI]帧动画

    ImageFrameAnimation.cs using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; [R ...

  2. 以虎嗅网4W+文章的文本挖掘为例,展现数据分析的一整套流程

    本文转自知乎 作者:苏格兰折耳喵 ----------------------------------------------------- 本文作者将结合自身经验,并以实际案例的形式进行呈现,涉及从 ...

  3. linux inode 详解 / 线上inode爆满解决方案

    本文大量参考阮一峰大神博客,整理笔记 之所以写inode文章是由于一次线上问题,引发对inode深入的思考. 磁盘的inode监控与磁盘空间的监控同等重要,线上服务器一定要做好磁盘inode与磁盘空间 ...

  4. Java安全编码标准

    Java安全编码标准 具体参考Rules 输入验证和数据净化(IDS)规则风险评估概要 IDS00-J净化穿越受信边界的非受信数据 IDS01-J验证前标准化字符串 IDS02-J在验证之前标准化路径 ...

  5. [AS3]as3中splice和slice的用法介绍说明

    splice 删除数组一段连续的元素,返回被删除的元素数组 var arr:Array = ["a","b","c","d&quo ...

  6. 配置maven访问nexus,配置项目pom.xml以发布maven项目到nexus中

    maven访问nexus有三种配置方法,分别为: 项目pom.xml,优先级最高: user的settings.xml,优先级中,未在pom.xml中配置repository标签,则使用这个配置: m ...

  7. 使用原生js实现前端分页功能

    背景: 从后台提取出来数据,在前端进行分页. 代码: user-manage.js window.onload = function(){ var result = { message : " ...

  8. Redis-stat 的安装与使用

    一.ruby源码安装 下载最新版的 Ruby 压缩文件.请点击这里下载. 下载 Ruby 之后,解压到新创建的目录下: $ tar -xvzf ruby-2.2.3.tgz $ cd ruby-2.2 ...

  9. 使用hibernate与mysql时数据不能插入的原因及解决办法

    1.背景 之前从没用过hibernate,因此在网上搜了一下hibernate快速入门方面的信息,最后我按照<Myeclipse Hibernate 快速入门 中文版>(CSDN,百度文库 ...

  10. gitlab docker安装配置ldap

    镜像下载 直接从dockerhub 下载官方镜像即可 docker pull gitlab/gitlab-ce 首次运行 在某个位置创建一个文件夹并运行如下命令: docker run --hostn ...