【问题标题】:Why is StringTokenizer deprecated?为什么不推荐使用 StringTokenizer?
【发布时间】:2011-10-22 11:14:33
【问题描述】:

Java 文档似乎没有提到任何关于 StringTokenizer 的弃用,但我一直听说它在很久以前是如何被弃用的。是因为它有错误/错误而被弃用,还是String.split() 总体上更好用?

我有一些使用 StringTokenizer 的代码,我想知道是否应该认真考虑将其重构为使用 String.split(),或者弃用是否纯粹是为了方便而我的代码是安全的。

【问题讨论】:

  • StringTokenizer 是一个遗留类(即有更好的替代品),但它已被弃用。仅当类/方法有一些 严重 缺点时才会弃用。 Vector 也发生了类似的情况:您几乎总是可以将其替换为 ArrayList,但它不是“坏”或“损坏”,因此不会被弃用。
  • @Joachim 如果可以接受 cmets 我会接受
  • StringTokenizer 有一个严重的常识性问题:它将连续的分隔符视为一个分隔符。这不是常识或传统意义上的。例如,在 csv 中,'a,,b' 表示 3 个字段,第 2 个字段为空。但在 Stringtokenizer 中,它默认将其视为只有 2 个字段,',,' 被视为 ','。这已经使许多程序员感到困惑,并使他们经历不必要的调试工作。 *** 只是不要再使用它 ***
  • @Scott Chu:同意它不像其他方法那样严谨。但是,如果您创建一个新的 ST 以便在标记值中包含分隔符,则在某种意义上,您可以通过检查每个标记是否仅包含一个分隔符作为其值来取回空值。当然,程序员有责任砍掉每个标记的最后一个字符,因为它将是一个分隔符……除非它是标记集合中的最后一个标记……呃,太痛苦了。所以我同意,使用差异。当您想将空标记值计为返回值时的方法比使用 ST 更好。
  • 是的,在我看来,当 StringTokenizer 开始退居到 split() 之后,JDK 应该包含某些版本的 split,其行为类似于现在存在的 split() 但不包括开销或正则表达式的复杂性。

标签: java string split deprecated stringtokenizer


【解决方案1】:

来自StringTokenizer的javadoc:

StringTokenizer 是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人改用 String 的 split 方法或 java.util.regex 包。

如果您查看String.split() 并将其与StringTokenizer 进行比较,相关区别在于String.split() 使用正则表达式,而StringTokenizer 仅使用逐字拆分字符。因此,如果我想用比单个字符更复杂的逻辑来标记一个字符串(例如,在\r\n 上拆分),我不能使用StringTokenizer,但我可以使用String.split()

【讨论】:

    【解决方案2】:
    1. Java 10 String Tokenizer -- 未弃用
    2. Java 9 String Tokenizer -- 未弃用
    3. Java 8 String Tokenizer -- 未弃用
    4. Java 7 String Tokenizer -- 未弃用
    5. Java 6 String Tokenizer -- 未弃用
    6. Java 5 String Tokenizer -- 未弃用

    如果它没有被标记为已弃用,它不会消失。

    【讨论】:

    • "StringTokenizer 是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人使用 String 的 split 方法或 java.util.regex而是打包。”
    • 旧版与弃用不同。
    • 就我个人而言,使用 StringTokenizer 的代码看起来更简单、更干净。
    • 是的,我使用@h22,通常 StringTokenizer 代码比使用拆分更优雅/可读。当我真正需要更新的行为时,我会保存拆分。
    【解决方案3】:

    我个人觉得 StringTokenizer 已被弃用,因为它只是一种复杂的方式来做一些非常简单的事情。顾名思义,StringTokenizer 仅适用于字符串,所以为什么不直接将其作为字符串中的方法。此外,StringTokenizer 不支持 RegularExpression 不支持正则表达式,这在 90 年代末和 00 年代初期变得非常普遍,因此实际上变得毫无用处。

    【讨论】:

    • 你是对的,不是,只是建议你不要使用它。不同之处在于不保证在未来版本中将继续提供已弃用的类。
    • 这也不对。绝对保证向后二进制兼容性。
    【解决方案4】:

    我不认为这是 String.split 方法的原因,因为 split 是解析字符串的慢方法 - 它在内部编译了一个模式。

    StringTokenizer 可以替换为功能更强大的类,例如 java.util.Scanner,或者您可以使用模式匹配器通过正则表达式获取组。

    【讨论】:

      【解决方案5】:
      1. StringTokenizer 未被弃用

      2. 功能和输出略有不同...

      例如,如果您有"aaa.aa.aa",并且想将其拆分为"aaa""aa""a" 部分,则只需编写:

      new StringTokenizer("aaa.aa.aa", ".")
      

      如果你只是使用:

      "aaa.aa.aa".split(".")
      

      它返回一个空数组,因为它匹配. 是空格字符的正则表达式。所以你必须逃避它:

      "aaa.aa.aa".split("\\.")
      

      所以基本上 .. split 使您能够使用正则表达式 ... 它非常有用

      但是StringTokenizer通过标记解析文本......并且标记甚至可以是特殊字符

      【讨论】:

        【解决方案6】:

        StringTokenize 存在问题...

        拆分必须使用正则表达式,StringTokenizer使用的是String或CharSequence,

        但是

        "a.b..".split(".") 将返回 {"a","b",""}

        和 "a.b.." 的 StringTokenizer ... 将只返回 {"a","b"}

        这非常棘手!!!小心!!!

        StringTokenizer 更好、更安全的替代方案是:

        StrongTokenizerorg.apache.common.lang3 中要好得多...它具有更大的灵活性或

        com.google.common.base.Splitter

        【讨论】:

        • 没错。而这个问题让我们的程序员付出了巨大的努力才找到了一个“蝴蝶效应”的错误。为什么 Java 团队一开始就发明了这么糟糕的东西?... 叹息!
        【解决方案7】:

        StringTokenizer 实际上并没有被弃用StringTokenizer 比 String.split() 快 4 倍,并且在竞争性编程中它被许多开发人员使用。

        来源:-Faster Input for Java

        【讨论】:

        • 这仍然有效吗?
        • 根据其他答案是的,只是拆分更灵活,因为您可以使用正则表达式
        【解决方案8】:

        StringTokenizer 是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人使用 String 的 split 方法或 java.util.regex 包。

        以下示例显示了如何使用 String.split() 方法将字符串分解为其基本标记:

         String[] result = "this is a test".split("\\s");
        

        【讨论】:

          猜你喜欢
          • 2016-02-23
          • 2017-11-04
          • 2011-04-11
          • 2021-10-12
          • 2012-12-07
          • 2012-05-16
          • 2020-06-29
          • 2014-08-11
          • 2016-06-19
          相关资源
          最近更新 更多