152 votes

Scanner vs. StringTokenizer vs. String.Split

Je viens de découvrir la classe Scanner de Java et je me demande maintenant comment elle se compare à StringTokenizer et String.Split. Je sais que StringTokenizer et String.Split ne fonctionnent que sur les chaînes de caractères, alors pourquoi voudrais-je utiliser Scanner pour une chaîne de caractères ? Le Scanner est-il simplement destiné à être un guichet unique pour le fractionnement ?

237voto

Neil Coffey Points 13408

Ils sont essentiellement des chevaux de course.

  • Scanner est conçu pour les cas où vous devez analyser une chaîne de caractères, en extrayant des données de différents types. Elle est très flexible, mais on peut dire qu'elle ne vous offre pas l'API la plus simple pour obtenir simplement un tableau de chaînes de caractères délimitées par une expression particulière.

  • String.split() y Pattern.split() vous donnent une syntaxe facile pour faire cette dernière, mais c'est essentiellement tout ce qu'ils font. Si vous voulez analyser les chaînes de caractères résultantes, ou changer le délimiteur à mi-chemin en fonction d'un jeton particulier, ils ne vous aideront pas à le faire.

  • StringTokenizer est encore plus restrictive que String.split() et aussi un peu plus difficile à utiliser. Il est essentiellement conçu pour extraire des tokens délimités par des sous-chaînes fixes. À cause de cette restriction, il est environ deux fois plus rapide que String.split() . (Voir mon comparaison de String.split() y StringTokenizer .) Elle est également antérieure à l'API des expressions régulières, dont String.split() en fait partie.

Vous noterez dans mes chronologies que String.split() peut toujours tokeniser des milliers de chaînes de caractères en quelques millisecondes sur une machine typique. En outre, il présente l'avantage de StringTokenizer qu'il vous donne la sortie comme un tableau de chaînes, ce qui est généralement ce que vous voulez. L'utilisation d'un Enumeration conformément aux dispositions de la StringTokenizer est trop "syntaxiquement difficile" la plupart du temps. De ce point de vue, StringTokenizer est un peu un gaspillage d'espace de nos jours, et vous pouvez tout aussi bien utiliser la fonction String.split() .

57voto

Michael Myers Points 82361

Commençons par éliminer StringTokenizer . Il se fait vieux et ne supporte même pas les expressions régulières. Sa documentation indique :

StringTokenizer est une ancienne classe qui est conservée pour des raisons de compatibilité, bien que son utilisation soit déconseillée dans le nouveau code. Il est recommandé à toute personne recherchant cette fonctionnalité d'utiliser la classe split méthode de String ou le java.util.regex à la place.

Alors jetons-le tout de suite. Cela laisse split() y Scanner . Quelle est la différence entre eux ?

D'abord, split() renvoie simplement un tableau, ce qui permet d'utiliser facilement une boucle foreach :

for (String token : input.split("\\s+") { ... }

Scanner est construit plus comme un ruisseau :

while (myScanner.hasNext()) {
    String token = myScanner.next();
    ...
}

ou

while (myScanner.hasNextDouble()) {
    double token = myScanner.nextDouble();
    ...
}

(Il a un plutôt grande API Ne croyez donc pas qu'elle se limite toujours à des choses aussi simples).

Cette interface de type flux peut être utile pour analyser des fichiers texte simples ou l'entrée de la console, lorsque vous n'avez pas (ou ne pouvez pas obtenir) toute l'entrée avant de commencer l'analyse.

Personnellement, la seule fois où je me rappelle avoir utilisé Scanner c'est pour des projets scolaires, lorsque je devais obtenir des entrées utilisateur à partir de la ligne de commande. Il rend ce genre d'opération facile. Mais si j'ai un String que je veux diviser, c'est presque une évidence d'aller avec split() .

9voto

Marcelo Morales Points 2260

StringTokenizer était toujours là. C'est le plus rapide de tous, mais l'idiome de type énumération n'est peut-être pas aussi élégant que les autres.

split a vu le jour avec le JDK 1.4. Plus lent que tokenizer mais plus facile à utiliser, puisqu'il est appelable depuis la classe String.

Scanner est apparu avec le JDK 1.5. C'est la plus flexible et elle comble une lacune de longue date de l'API Java en prenant en charge un équivalent de la célèbre famille de fonctions scanf de Cs.

5voto

Bill the Lizard Points 147311

Si vous avez un objet String que vous voulez tokeniser, privilégiez l'utilisation de la méthode String. divisé sur un StringTokenizer. Si vous devez analyser des données textuelles provenant d'une source extérieure à votre programme, comme un fichier, ou de l'utilisateur, c'est là qu'un Scanner est utile.

4voto

pdeva Points 4597

J'ai récemment fait quelques expériences sur les mauvaises performances de String.split() dans des situations très sensibles aux performances. Vous pouvez trouver cela utile.

http://eblog.chrononsystems.com/hidden-evils-of-javas-stringsplit-and-stringr

L'essentiel est que String.split() compile un motif d'expression régulière à chaque fois et peut donc ralentir votre programme, par rapport à l'utilisation d'un objet motif précompilé et à son utilisation directe pour opérer sur une chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X