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.
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()
.
Si ce n'est pas marqué comme obsolète, il ne va pas disparaître.
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
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
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.
StringTokenizer n'est pas obsolète
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
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");