【问题标题】:What is the difference between split method in String class and the split method in Apache StringUtils?String 类中的 split 方法和 Apache StringUtils 中的 split 方法有什么区别?
【发布时间】:2014-09-20 06:14:33
【问题描述】:

我正在逐行读取文件,并希望根据特定的分隔符分割每一行。我在 String 类和 StringUtils 类中找到了一些可用的选项。

所以我的问题是哪个是更好的选择,为什么?

【问题讨论】:

  • 你可以参考这个链接:tvp-technical.blogspot.in/2012/01/…
  • String.splitstrange 并且效率低下,因为它每次都编译正则表达式。不知道 StringUtils,使用 Guava 的 Splitter。
  • @maaartinus 自从 JDK 7 优化了本机拆分方法以来,这种低效率的情况不再存在。如果字符串是 1 个字符长或 2 个字符且第一个字符是反斜杠,则不使用正则表达式,可以查看源代码以获取更多详细信息

标签: java string performance string-utils


【解决方案1】:

这取决于用例。

有什么区别?

String[] split(String regEx)

String[] results = StringUtils.split(String str,String separatorChars)

  1. Apache utils split() 是空安全的。 StringUtils.split(null) 将返回 null。 JDK 默认不是 null 安全的:

    try{ String testString = null; String[] result = testString.split("-"); System.out.println(result.length); } catch(Exception e) { System.out.println(e); // results NPE }

  2. 默认String#split() 使用正则表达式来拆分字符串。
    Apache 版本StringUtils#split() 使用空格/字符/字符串字符/null [取决于 split() 方法签名]。
    由于复杂的正则表达式在广泛使用时非常昂贵,因此默认的String.split() 不是一个好主意。否则会更好。

  3. 当用于标记字符串时,如以下 string.split() 返回一个额外的空字符串。而 Apache 版本给出了 结果正确

     String testString = "$Hello$Dear$";

     String[] result = testString.split("\\$");
     System.out.println("Length is "+ result.length); //3
     int i=1;
     for(String str : result) {
        System.out.println("Str"+(i++)+" "+str);
     }

输出

Length is 3
Str1 
Str2 Hello
Str3 Dear

String[] result = StringUtils.split(testString,"$");
System.out.println("Length is "+ result.length); // 2
int i=1;
for(String str : result) {
    System.out.println("Str"+(i++)+" "+str);
}

输出

Length is 2
Str1 Hello
Str2 Dear

【讨论】:

    【解决方案2】:

    嗯,这真的取决于你想要实现什么。阅读StringStringUtils 上的split 方法的文档,它们彼此完全不同。并根据您的要求

    ...想根据特定的分隔符分割每一行。

    看来你需要的是String中的split方法

    • public String[] split(String regex) - 拆分这个字符串 给定正则表达式的匹配项。 (src)

    例如:

    String str = "abc def";
    str.split(" ");
    

    返回:

    ["abc", "def"]
    

    因为StringUtils中的那个是:

    • public static String[] split(String str) - 拆分提供的文本 到一个数组中,使用 whitespace 作为分隔符。 (src)

    例如:

    StringUtils.split("abc def")
    

    返回:

    ["abc", "def"]
    

    虽然它是一个重载方法,所以您可以使用带有另一个参数作为分隔符的方法

    • public static String[] split(String str, char separatorChar) - 将提供的文本拆分为一个数组,指定分隔符。这是 使用 StringTokenizer 的替代方法。

    【讨论】:

    • StringUtils.split(final String str, final String separatorChars)。比较 StringUtils.split(final String str)String.split(String regex) 没有任何意义。
    • @Tom,你在说什么?
    • 您认为比较其中一种方法不符合 OP 要求的两种方法有何意义?将String.split()StringUtils.split() 的版本进行比较会不会更有意义,因为相同的可访问信息/对象可以做同样的事情?
    【解决方案3】:

    值得注意的是,StringUtils.split 文档指出: .相邻的分隔符被视为一个分隔符 例如StringUtils.split("parm1,parm2,,parm4", ",") 给出 ["parm1", "parm2", "parm4"] 如果你想要 ["parm1", "parm2","" ,"parm4"] 你需要 StringUtils.splitPreserveAllTokens

    【讨论】:

      猜你喜欢
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多