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

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

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

Ответ 1

Из javadoc для StringTokenizer:

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

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

Ответ 3

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

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

Ответ 4

Есть проблема с StringTokenize...

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

но

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

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

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

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

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

com.google.common.base.Splitter

Ответ 5

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

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

Ответ 6

  • StringTokenizer не устарел

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

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

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

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

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

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

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

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

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

Ответ 7

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

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

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

Ответ 8

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