web-dev-qa-db-ja.com

StringTokenizerが推奨されないのはなぜですか?

JavaドキュメンテーションはStringTokenizerの非推奨について何も言及していないようですが、それがずっと前に非推奨になった方法について聞いています。バグ/エラーがあったため非推奨でしたか? 、またはString.split()は単に全体的に使用した方が良いですか?

StringTokenizerを使用するコードがいくつかあり、String.split()を使用するようにリファクタリングすることに真剣に取り組む必要があるのか​​、それとも非推奨が純粋に便利でコードが安全なのか疑問に思っています。

47
donnyton

StringTokenizer のjavadocから:

StringTokenizerは、新しいコードでは使用が推奨されていませんが、互換性の理由で保持されるレガシークラスです。この機能を探している人は、代わりにStringのsplitメソッドまたはJava.util.regexパッケージを使用することをお勧めします。

String.split() を見てStringTokenizerと比較すると、関連する違いはString.split()が正規表現を使用するのに対し、StringTokenizerは、そのままの文字をそのまま使用します。したがって、単一の文字よりも複雑なロジック(たとえば、_\r\n_で分割)で文字列をトークン化する場合、StringTokenizerは使用できませんが、String.split()は使用できます。

63
Jason S
  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 -非推奨ではありません

非推奨としてマークされていない場合、消えません。

83

StringTokenizerは実際には非推奨ではありませんStringTokenizerはString.split()より4倍高速であり、競合プログラミングでは多くの開発者が使用しています。

ソース:- Javaの高速入力

13

StringTokenizeに問題があります...

分割は正規表現を使用する必要があり、StringTokenizerはStringまたはCharSequenceを使用しています、

しかし

"a.b..".split("."){"a","b",""}を返します

「a.b ..」のStringTokenizer ...は{"a"、 "b"}のみを返します

そして、これは非常に難しいです!!!注意してください!!!

StringTokenizerのより適切で安全な代替手段は次のとおりです。

StrongTokenizerorg.Apache.common.lang3にあり、はるかに優れています。

com.google.common.base.Splitter

1
cruiserupce

私はその理由がString.splitメソッドだとは思わない。なぜなら、splitは文字列を解析するのに遅い方法だからだ-内部でパターンをコンパイルするからだ。

StringTokenizerは、Java.util.Scannerなどのより機能的なクラスに置き換えるか、パターンマッチャーを使用して正規表現でグループを取得できます。

0
Andrey Krot
  1. StringTokenizerは非推奨ではありません

  2. それは少し異なる機能と出力です...

たとえば、"aaa.aa.aa"そしてそれを部分に分割したい"aaa""aa"および"a"、次のように書くことができます。

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

使用する場合:

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

empty arrayを返します。これは、.は空間文字です。だからあなたはそれをエスケープする必要があります:

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

基本的に.. splitを使用すると、正規表現を使用できます...非常に便利です

しかし、StringTokenizerはトークンでテキストを解析します...トークンは特殊文字でもかまいません

0
cruiserupce

StringTokenizerは、互換性のために保持されているレガシークラスですが、新しいコードでは使用しないでください。この機能を探している人は、代わりにStringのsplitメソッドまたはJava.util.regexパッケージを使用することをお勧めします。

次の例は、String.split()メソッドを使用して文字列を基本トークンに分割する方法を示しています。

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