Почему StringTokenizer устарел?
Документация Java, кажется, не упоминает ничего об устаревании для StringTokenizer
Тем не менее, я продолжаю слышать о том, как это давно устарело. Было ли это устаревшим, потому что он имел ошибки / ошибки, или String.split()
просто лучше использовать в целом?
У меня есть код, который использует StringTokenizer
и мне интересно, если я должен быть серьезно обеспокоен рефакторингом его использовать String.split()
или просто ли устаревание является делом удобства и мой код безопасен.
8 ответов
Из Javadoc для StringTokenizer:
StringTokenizer
является устаревшим классом, который сохраняется по соображениям совместимости, хотя его использование не рекомендуется в новом коде. Всем, кто ищет эту функциональность, рекомендуется вместо этого использовать метод split String или пакет java.util.regex.
Если вы посмотрите на String.split()
и сравнить это с StringTokenizer
соответствующая разница в том, что String.split()
использует регулярное выражение, тогда как StringTokenizer
просто использует буквально разделенные символы. Так что, если я хотел бы токенизировать строку с более сложной логикой, чем отдельные символы (например, разделить на \r\n
) Я не могу использовать StringTokenizer
но я могу использовать String.split()
,
- Java 10 String Tokenizer - не рекомендуется
- Java 9 String Tokenizer - не рекомендуется
- Java 8 String Tokenizer - не рекомендуется
- Java 7 String Tokenizer - не рекомендуется
- Java 6 String Tokenizer - не рекомендуется
- Java 5 String Tokenizer - не рекомендуется
Если он не помечен как устаревший, он не исчезнет.
StringTokenizer не считается устаревшим, фактически StringTokenizer в 4 раза быстрее, чем String.split(), и в конкурентном программировании его используют многие разработчики.
Источник:- Более быстрый ввод для Java
Существует проблема с StringTokenize...
Сплит должен использовать регулярное выражение, StringTokenizer использует String или CharSequence,
но
"a.b..".split(".")
вернусь {"a","b",""}
и StringTokenizer от "ab."... вернет только {"a","b"}
И это очень сложно!!! Будь осторожен!!!
Лучшими и безопасными альтернативами StringTokenizer являются:
Намного лучше StrongTokenizer
в org.apache.common.lang3
... это гораздо больше гибкости или
com.google.common.base.Splitter
StringTokenizer не считается устаревшим
Это немного другая функция и выход...
Например, если у вас есть "aaa.aa.aa"
и хочу разбить его на части "aaa"
, "aa"
а также "a"
Вы можете просто написать:
new StringTokenizer("aaa.aa.aa", ".")
Если вы просто используете:
"aaa.aa.aa".split(".")
Он возвращает пустой массив, потому что он соответствует регулярным выражениям где .
это пространственный характер. Таким образом, вы должны избежать этого:
"aaa.aa.aa".split("\\.")
Так что в основном.. split позволяет вам использовать регулярные выражения... это может быть очень полезно
Но StringTokenizer разбирает текст по токенам... и токен может быть даже специальным символом
Я не думаю, что причина этого в методе String.split, потому что split - это медленный способ разбора строки - он компилирует шаблон внутри.
StringTokenizer просто может быть заменен более функциональными классами, такими как java.util.Scanner или вы можете использовать шаблонное сопоставление для получения групп с помощью регулярных выражений.
StringTokenizer - это устаревший класс, который сохраняется по соображениям совместимости, хотя его использование не рекомендуется в новом коде. Всем, кто ищет эту функциональность, рекомендуется вместо этого использовать метод split String или пакет java.util.regex.
В следующем примере показано, как метод String.split() можно использовать для разбиения строки на ее основные токены:
String[] result = "this is a test".split("\\s");
Лично я чувствую, что StringTokenizer устарел, потому что это был просто сложный способ сделать что-то довольно простое. StringTokenizer, как следует из названия, применяется только к Strings, так почему бы просто не сделать его методом в String. Кроме того, StringTokenizer не поддерживает RegularExpression, не поддерживает регулярные выражения, что стало чрезвычайно распространенным явлением в конце 90-х и начале 00-х годов, что делает его практически бесполезным.