web-dev-qa-db-fra.com

Différence entre l'utilisation de StringTokenizer et String.split ()?

J'utilise String[] split(String) of String class pour scinder une chaîne pour un délimiteur donné, et cela a bien fonctionné.

Cependant, il est maintenant prévu de re-factoriser la même logique avec StringTokenizer. Mais quelles sont les différences et les avantages d'utiliser l'un par rapport à l'autre?.

De plus, j'estime que String[] renvoyé par split() au cours d'un seul appel est une option bien plus efficace que d'utiliser les objets de la classe StringTokenizer.

13
Satyendra

-> String.split() et Pattern.split() vous donnent une syntaxe simple pour effectuer cette dernière opération, mais c’est tout ce qu’ils font. Si vous souhaitez analyser les chaînes résultantes ou modifier le délimiteur à mi-parcours en fonction d'un jeton particulier, ils ne vous aideront pas.

-> StringTokenizer est encore plus restrictif que String.split(), et aussi un peu fiddlier à utiliser. Il est essentiellement conçu pour extraire des jetons délimités par des sous-chaînes fixes. En raison de cette restriction, il est environ deux fois plus rapide que String.split(). (Voir ma comparaison entre String.split() et StringTokenizer .) Elle est également antérieure à l’API des expressions régulières, dont String.split() fait partie.

Vous noterez d'après mes timings que String.split() peut encore marquer des milliers de chaînes en quelques millisecondes sur une machine typique. De plus, StringTokenizer a l'avantage de vous donner la sortie sous forme de tableau de chaînes, ce qui correspond généralement à ce que vous souhaitez. L'utilisation de Enumeration, fournie par StringTokenizer, est trop "syntaxiquement difficile" la plupart du temps. De ce point de vue, StringTokenizer est un peu une perte d’espace de nos jours, et vous pouvez aussi bien utiliser String.split().

Réponse de ce lien

18
Shoaib Chikate

Jetez un coup d'oeil au JavaDocs

StringTokenizer est une classe héritée conservée pour des raisons de compatibilité raisons bien que son utilisation soit découragée dans le nouveau code. C'est recommandé que ceux qui recherchent cette fonctionnalité utilisent la méthode split de String ou le package Java.util.regex à la place.

L'exemple suivant montre comment la méthode String.split peut être utilisé pour diviser une chaîne en ses jetons de base:

 String[] result = "this is a test".split("\\s");
 for (int x=0; x<result.length; x++)
     System.out.println(result[x]);
17
MadProgrammer

String#split accepte une expression régulière si StringTokenizer accepte simplement une String qui divise la chaîne. Vous devriez toujours vous en tenir au String#split, il est plus robuste que StringTokenizer.

1
Petr Mensik

Lire ceci

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é à ceux qui recherchent cette fonctionnalité d’utiliser plutôt la méthode split de String ou le package Java.util.regex.

1
Ankit Rustagi

J'ai le programme suivant, 

La chaîne "x" est une tabulation séparée 12s34; 

    public class Testoken {
        public static void main(String[] args) {
            String x = "1   2   s       3           4   ";
            StringTokenizer st = new StringTokenizer(x,"\t");
            int i = 0;
            while(st.hasMoreTokens()){
                System.out.println("token-->"+st.nextToken());            
                i++;
            }
            System.out.println("i-->"+i);//elements from tokenizer
            String [] a = x.split("\t");
            System.out.println("length--->"+a.length);
            for(int y = 0;y<a.length;y++){
            System.out.println("value-->"+a[y]);//elements from split
            }
        }
    }   





Output: 

token-->1 
token-->2 
token-->s 
token-->3 
token-->4 
i-->5 
length--->8 
value-->1 
value-->2 
value-->s 
value--> 
value-->3 
value--> 
value--> 
value-->4
1
user2114253

http://docs.Oracle.com/javase/6/docs/api/Java/util/StringTokenizer.html dire:

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é à ceux qui recherchent cette fonctionnalité d’utiliser plutôt la méthode split de String ou le package Java.util.regex.

Donc, je dirais, ne le changez pas et montrez cette ligne à la personne qui a recommandé de la refactoriser. Ils ont peut-être des informations anciennes ou une autre bonne raison de vous le dire.

0
koljaTM

Voici un lien répondant (de mon point de vue) à la question: http://lavnish.blogspot.com/2008/05/stringsplit-vs-stringtokenizer.html

0
Kaem Jii