web-dev-qa-db-fra.com

Pourquoi StringTokenizer est-il déconseillé?

La documentation Java ne semble rien mentionner à propos de la dépréciation de StringTokenizer, et pourtant je continue à entendre parler de la façon dont elle a été dépréciée il y a longtemps. Est-ce que c'était obsolète parce qu'il y avait des bugs/erreurs, ou est-ce que String.split() est simplement préférable d'utiliser globalement?

J'ai un code qui utilise StringTokenizer et je me demande si je devrais être sérieusement préoccupé par sa refactorisation pour utiliser String.split() ou si la dépréciation est purement une question de commodité et si mon code est sûr.

47
donnyton

Du javadoc pour StringTokenizer :

StringTokenizer est une classe héritée conservée pour des raisons de compatibilité bien que son utilisation soit découragée dans le nouveau code. Il est recommandé à toute personne recherchant cette fonctionnalité d’utiliser plutôt la méthode split de String ou le package Java.util.regex. 

Si vous examinez String.split() et que vous le comparez à StringTokenizer, la différence pertinente est que String.split() utilise une expression régulière, alors que StringTokenizer utilise uniquement des caractères fractionnés. Par conséquent, si je souhaitais créer une chaîne avec une logique plus complexe que des caractères uniques (par exemple, scindé en \r\n), je ne peux pas utiliser StringTokenizer mais je peux utiliser String.split().

62
Jason S
  1. Java 10 String Tokenizer - non obsolète
  2. Java 9 String Tokenizer - non obsolète
  3. Java 8 String Tokenizer - non obsolète
  4. Java 7 String Tokenizer - non obsolète
  5. Java 6 String Tokenizer - non obsolète
  6. Java 5 String Tokenizer - non obsolète

Si ce n'est pas marqué comme obsolète, il ne va pas disparaître.

80
nicholas.hauschild

StringTokenizer n'est pas obsolète en fait StringTokenizer est 4X plus rapide que String.split () et est utilisé par de nombreux développeurs dans la programmation concurrente.

Source: - Entrée plus rapide pour Java

13
Nishant Thapliyal

Il y a un problème avec StringTokenize ...

Split doit utiliser regex, StringTokenizer utilise String ou CharSequence,

mais

"a.b..".split(".") retournera {"a","b",""}

et StringTokenizer de "a.b .." ... renverra seulement {"a", "b"}

Et c'est très délicat !!! Fais attention!!!

Des alternatives meilleures et plus sûres à StringTokenizer sont:

Beaucoup mieux StrongTokenizer est dans org.Apache.common.lang3 ... il a beaucoup plus de flexibilité ou

com.google.common.base.Splitter

1
cruiserupce

Je ne pense pas que la raison en soit la méthode String.split, car split est un moyen lent d’analyser la chaîne - elle compile un motif à l’intérieur.

StringTokenizer peut simplement être remplacé par une classe plus fonctionnelle telle que Java.util.Scanner ou vous pouvez utiliser un matcher de modèle pour obtenir les groupes par regexp.

0
Andrey Krot
  1. StringTokenizer n'est pas obsolète

  2. C'est peu différent de la fonction et de la sortie ...

Par exemple, si vous avez "aaa.aa.aa" et que vous voulez le scinder en parties "aaa", "aa" et "a", vous pouvez simplement écrire:

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

Si vous utilisez simplement:

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

Il retourne un tableau vide , car il correspond aux expressions régulières où . est un caractère spatial. Il faut donc y échapper:

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

Donc, fondamentalement .. split vous permet d’utiliser regex ... cela peut être très utile

Mais StringTokenizer analyser le texte par les jetons ... et jeton peut même être un caractère spécial

0
cruiserupce

StringTokenizer est une classe héritée 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 plutôt la méthode split de String ou le package Java.util.regex.

L'exemple suivant montre comment utiliser la méthode String.split () pour décomposer une chaîne en ses jetons de base:

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