Почему 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()
.
Ответ 2
Если он не отмечен как устаревший, он не уходит.
Ответ 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
Например, если у вас есть "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, следовательно, сделало его практически бесполезным.