Почему StringTokenizer устарел? - PullRequest
       38

Почему StringTokenizer устарел?

47 голосов
/ 08 августа 2011

В документации Java, похоже, ничего не говорится об устаревании для StringTokenizer, но я продолжаю слышать о том, как это давно устарело. Это устарело, потому что в нем были ошибки / ошибки, или String.split() просто лучше использовать в целом?

У меня есть какой-то код, который использует StringTokenizer, и мне интересно, стоит ли мне серьезно беспокоиться о его рефакторинге для использования String.split() или о том, что устаревание - просто вопрос удобства и мой код безопасен.

Ответы [ 8 ]

83 голосов
/ 08 августа 2011
  1. Java 10 String Tokenizer - не рекомендуется
  2. Java 9 String Tokenizer - не рекомендуется
  3. Java8 String Tokenizer - не рекомендуется
  4. Java 7 String Tokenizer - не рекомендуется
  5. Java 6 String Tokenizer - не рекомендуется
  6. Java 5 String Tokenizer - не рекомендуется

Если он не помечен как устаревший, он не исчезает.

63 голосов
/ 08 августа 2011

Из javadoc для StringTokenizer :

StringTokenizer - это устаревший класс, который сохраняется из соображений совместимости, хотя его использование не рекомендуется в новом коде.Всем, кто ищет эту функцию, рекомендуется вместо этого использовать метод split String или пакет java.util.regex.

Если вы посмотрите на String.split() и сравните его с StringTokenizer, различие будет в том, что String.split() использует регулярное выражение, тогда как StringTokenizer просто использует дословноразделить персонажей.Поэтому, если я хотел бы токенизировать строку с более сложной логикой, чем отдельные символы (например, разделить на \r\n), я не могу использовать StringTokenizer, но я могу использовать String.split().

13 голосов
/ 31 июля 2015

StringTokenizer фактически не считается устаревшим StringTokenizer в 4 раза быстрее, чем String.split () , и в конкурентном программировании он используется многими разработчиками.

Источник: - Ускоренный вводдля Java

1 голос
/ 09 июля 2014

Существует проблема с StringTokenize ...

Для разделения необходимо использовать регулярное выражение, StringTokenizer использует String или CharSequence,

, но

"a.b..".split(".") вернется {"a","b",""}

и StringTokenizer "ab."... вернет только {"a", "b"}

И это очень сложно !!!Будьте осторожны !!!

Лучшими и безопасными альтернативами StringTokenizer являются:

Намного лучше StrongTokenizer в org.apache.common.lang3 ... у него гораздо больше гибкости или

com.google.common.base.Splitter

0 голосов
/ 18 декабря 2017

StringTokenizer - это устаревший класс, который сохраняется по соображениям совместимости, хотя его использование не рекомендуется в новом коде.Всем, кто ищет эту функцию, рекомендуется использовать вместо этого метод split String или пакет java.util.regex.

В следующем примере показано, как метод String.split () можно использовать для разбиения строкив основные токены:

 String[] result = "this is a test".split("\\s");
0 голосов
/ 10 июня 2014
  1. StringTokenizer не считается устаревшим

  2. Это немного другая функция и выход ...

Например, если у вас есть "aaa.aa.aa" и вы хотите разбить его на части "aaa", "aa" и "a", вы можете просто написать:

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

Если вы просто используете:

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

Возвращает пустой массив , поскольку он совпадает с регулярными выражениями, где . является пространственным символом. Таким образом, вы должны избежать этого:

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

Так что в основном .. split позволяет вам использовать регулярные выражения ... это может быть очень полезно

Но StringTokenizer анализирует текст по токенам ... и токен может быть даже специальным символом

0 голосов
/ 08 августа 2011

Не думаю, что причина этого в методе String.split, потому что split - это медленный способ разбора строки - он компилирует шаблон внутри.

StringTokenizer просто можно заменить на болеефункциональные классы, такие как java.util.Scanner или другие, вы можете использовать шаблонное сопоставление для получения групп с помощью регулярных выражений.

0 голосов
/ 08 августа 2011

Лично я чувствую, что StringTokenizer устарел, потому что это был просто сложный способ сделать что-то довольно простое. StringTokenizer, как следует из названия, применяется только к Strings, так почему бы просто не сделать его методом в String. Кроме того, StringTokenizer не поддерживает RegularExpression, не поддерживает регулярные выражения, что стало чрезвычайно распространенным явлением в конце 90-х и начале 00-х годов, что делает его практически бесполезным.

...