В чем разница между StringTokenizer и java.util.Класс сканера

#java

#java

Вопрос:

У меня есть вопрос относительно разницы между StringTokenizer классом и java.util.Scanner классом? Хотя оба они используются для целей разбиения (токенизации). Какой из них лучше использовать и имеет лучшую эффективность? Являются ли эти два класса Java альтернативами друг другу или имеют отдельные цели?

Ответ №1:

Из StringTokenizer javadoc

Класс string tokenizer позволяет приложению разбивать строку на токены…. Методы StringTokenizer не различают идентификаторы, числа и строки, заключенные в кавычки…

Из Scanner javadoc

Простой текстовый сканер, который может анализировать примитивные типы и строки с помощью регулярных выражений.

Таким образом, сканер, в отличие от StringTokenizer, имеет такие методы, как nextInt, nextBoolean и т. Д. В то время как Scanner полезен в некоторых случаях, когда вам нужно проанализировать пользовательский ввод, содержащий числа, StringTokenizer в большинстве случаев можно заменить org.apache.commons.lang .StringUtils.split — который не использует регулярные выражения и работает довольно быстро.

Ответ №2:

Из JavaDoc :

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

Комментарии:

1. Как я уже говорил в своем ответе String.split довольно медленный в отношении приложений с высокой нагрузкой. StringUtils.split намного быстрее.

2. Я думаю, что метод разделения класса java.util.regex.Pattern будет лучше, чем два

3. Это примерно в 10 раз медленнее, чем StringUtils.split.

4. @Naeem : String.split просто использует метод Pattern.split , поэтому он не может быть лучше, чем два. StringUtils.split намного быстрее, потому что он не использует регулярное выражение. Кстати, они изменили реализацию в Java 7, чтобы избежать использования регулярного выражения, когда аргумент шаблона прост и, следовательно, он не нужен.

Ответ №3:

Одно большое отличие заключается в том, что сканер может работать с потоками ввода, поэтому вам не нужно иметь его в памяти сразу (что в некоторых случаях даже невозможно, например, при непрерывном чтении пользовательского ввода с консоли).

Ответ №4:

Сканер предназначен для случаев, когда вам нужно проанализировать строку, извлекая данные разных типов.Если вы анализируете текстовые данные из источника вне вашей программы, например из файла или от пользователя, то именно здесь пригодится сканер.

StringTokenizer всегда был там. Это самый быстрый из всех, но идиома, подобная перечислению, может выглядеть не так элегантно, как другие.

split появился на JDK 1.4. Медленнее, чем tokenizer, но проще в использовании, поскольку он вызывается из класса String.