分享一个 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中是线程独立的。

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

转载请注明出处。

时间: 2024-12-08 04:59:00

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

java String.split()用法

Java中的我们可以利用split把字符串按照指定的分割符进行分割,然后返回字符串数组,下面是string.split的用法实例及注意事项: java.lang.string.split split 方法 将一个字符串分割为子字符串,然后将结果作为字符串数组返回. stringObj.split([separator,[limit]]) stringObj 必选项.要被分解的 String 对象或文字,该对象不会被split方法修改. separator 可选项.字符串或正则表达式对象,它标识了

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

在java.lang包中有String.split()方法的原型是:public String[] split(String regex, int limit)split函数是用于使用特定的切割符(regex)来分隔字符串成一个字符串数组,函数返回是一个数组.在其中每个出现regex的位置都要进行分解.需要注意是有以下几点:(1)regex是可选项.字符串或正则表达式对象,它标识了分隔字符串时使用的是一个还是多个字符.如果忽略该选项,返回包含整个字符串的单一元素数组.(2)limit也是可选项.

Java String.split()小点

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

分享一个java Map实现的cache manager,定时清除缓存起来的值

原文:分享一个java Map实现的cache manager,定时清除缓存起来的值 源代码下载地址:http://www.zuidaima.com/share/1550463676140544.htm 用来存储短暂对象的缓存类,实现Map接口,内部有一个定时器用来清除过期(30秒)的对象. 为避免创建过多线程,没有特殊要求请使用getDefault()方法来获取本类的实例. package com.zuidaima.modules.common.util; import java.util.A

java基础知识回顾之---java String final类之intern方法

public class StringObjectDemo { /** * @param args */ public static void main(String[] args) { String hello = "Hello", lo = "lo"; System.out.print((hello == "Hello") + " ");//true System.out.print((Other.hello == hel

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

原文:分享一个解析XML成为php数组的方法 <?php /* * To change this template, choose Tools | Templates * and open the template in the editor. */ $xml = 'site_1.xml'; $myxml = simplexml_load_file($xml); // print_r($myxml); print_r(xmlToArray($myxml)); function xmlToArra

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 example, split "a:b:c" with ":" results in [a, b, c] In some scenario, it's better to keep the delimeter instead of discard it while splitti

Java String.split()用法小结

它是java.lang包中的String.split()方法,返回是一个数组 总结一下,仅供大家参考:1.如果用“.”作为分隔的话,必须是如下写法:String.split("\\."),这样才能正确的分隔开,不能用String.split(".");2.如果用“|”作为分隔的话,必须是如下写法:String.split("\\|"),这样才能正确的分隔开,不能用String.split("|");“.”和“|”都是转义字符,

。。。Java String.split()函数的用法分析。。。

在java.lang包中有String.split()方法的原型是:public String[] split(String regex, int limit) split函数是用于使用特定的切割符(regex)来分隔字符串成一个字符串数组,函数返回是一个数组.在其中每个出现regex的位置都要进行分解. 需要注意是有以下几点: (1)regex是可选项.字符串或正则表达式对象,它标识了分隔字符串时使用的是一个还是多个字符.如果忽略该选项,返回包含整个字符串的单一元素数组. (2)limit也是