高效使用String.split方法

  首先来看split的源码:

public String[] split(String regex, int limit) {    /* fastpath if the regex is a     (1)one-char String and this character is not one of the        RegEx‘s meta characters ".$|()[{^?*+\\", or     (2)two-char String and the first char is the backslash and        the second is not the ascii digit or ascii letter.     */    char ch = 0;    if (((regex.value.length == 1 &&         ".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) ||         (regex.length() == 2 &&          regex.charAt(0) == ‘\\‘ &&          (((ch = regex.charAt(1))-‘0‘)|(‘9‘-ch)) < 0 &&          ((ch-‘a‘)|(‘z‘-ch)) < 0 &&          ((ch-‘A‘)|(‘Z‘-ch)) < 0)) &&        (ch < Character.MIN_HIGH_SURROGATE ||         ch > Character.MAX_LOW_SURROGATE))    {        int off = 0;        int next = 0;        boolean limited = limit > 0;        ArrayList<String> list = new ArrayList<>();        while ((next = indexOf(ch, off)) != -1) {            if (!limited || list.size() < limit - 1) {                list.add(substring(off, next));                off = next + 1;            } else {    // last one                //assert (list.size() == limit - 1);                list.add(substring(off, value.length));                off = value.length;                break;            }        }        // If no match was found, return this        if (off == 0)            return new String[]{this};

        // Add remaining segment        if (!limited || list.size() < limit)            list.add(substring(off, value.length));

        // Construct result        int resultSize = list.size();        if (limit == 0) {            while (resultSize > 0 && list.get(resultSize - 1).length() == 0) {                resultSize--;            }        }        String[] result = new String[resultSize];        return list.subList(0, resultSize).toArray(result);    }    //重点    return Pattern.compile(regex).split(this, limit);}

通过split方法的源码可以发现,在大部分情况下,split函数实际上是新建了一个Pattern对象,再去调用它的split函数,因此,如果我们一直调用String的split方法,就相当于在一直新建Pattern对象,会明显多占用内存,降低程序运行速度。此时可以对代码进行改进:
  Pattern pattern = Pattern.complie("[(*&(*%^*%]");
  for(String line : lines){
      pattern.split(line);
  }
  String中其它一些会在内部生成Pattern对象的函数还包括:
  matches
  replaceFirst
  replaceAll

原文地址:https://www.cnblogs.com/yuanfei1110111/p/10134289.html

时间: 2024-11-14 20:14:22

高效使用String.split方法的相关文章

C# String.split()用法小结。String.Split 方法 (String[],?StringSplitOptions)

split()首先是一个分隔符,它会把字符串按照split(' 字符')里的字符把字符串分割成数组,然后存给一个数组对象. 输出数组对象经常使用foreach或者for循环. 第一种方法 string s=abcdeabcdeabcde; string[] sArray=s.Split('c') ; foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab deab deab de 第二种方法 我们看到了结果

java String.split方法是用注意点(转)

转自:http://www.blogjava.net/fanyingjie/archive/2010/08/05/328059.html 在java.lang包中有String.split()方法,返回是一个数组我在应用中用到一些,给大家总结一下,仅供大家参考: 1.如果用“.”作为分隔的话,必须是如下写法:String.split("\\."),这样才能正确的分隔开,不能用String.split("."); 2.如果用“|”作为分隔的话,必须是如下写法:Stri

我爱java系列---【String.Split方法】

hello 大家好,好久不见,今天 我们要讨论的是java的split方法,或许你很早就知道了,但你真的知道吗? 我们来看看吧. 首先我们来看看我们最常用的split()方法也就是单个参数的方法 public String[] split(String regex) { return split(regex, 0); } 卧槽,这不是重载方法嘛,调用的是另外一个方法,而且还给了个默认值0,然后我们来看看重载的哪个方法 public String[] split(String regex, int

java中String对象的split方法

在java.lang包中有String.split()方法,返回是一个String[]数组,今天碰到一个自己没注意的问题: 1.特殊分隔符 String str1 = "123|456|789"; System.out.println(str1.split("|")[0]); 结果是1 这里要注意的是"|"作为分隔符要写成这样 System.out.println(str1.split("\\|")[0]); 同理如果用&qu

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

java中string.split() 方法比较强大,但是split()方法采用正则表达式,速度相对会慢一点, 其实大多数场景下并不需要使用正则表达式,下面分享一个不使用正则表达式分隔字符串的方法. 方法保证了和 string.split()的输出结果一致. 直接看代码: public static String[] split(String src,String delimeter){ String srcStr = src; String delimeterStr = delimeter;

Java String.split()用法小结

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

String split 分隔字符串,多个分隔符、正则表达式学习示例

import java.util.Arrays; import org.junit.Test; /** * 通过几个例子学习String split方法 * 尤其是记住使用多个分隔符的方式 * @author lzg * */ public class StringSplitTest { /** * 待分隔的字符串全是由分隔符组成 */ @Test public void test1(){ String str = ",,,,,,"; String [] strArray = str.

Java String.split()用法总结整理

在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1.如果用"."作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split("."); 2.如果用"|"作为分隔的话,必须是如下写法,String.split("\\|"),这样才能正确的分隔开,不能用String.s

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

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