Perché StringTokenizer è deprecato?

La documentazione Java non sembra menzionare nulla sulla deprecazione di StringTokenizer , tuttavia continuo a sentire come è stato ritirato molto tempo fa. Era deprecato perché aveva errori / bug, o è String.split() semplicemente meglio usare in generale?

Ho del codice che utilizza StringTokenizer e mi chiedo se dovrei seriamente preoccuparmi di refactoring per utilizzare String.split() , o se la deprecazione è puramente una questione di convenienza e il mio codice è sicuro.

Da javadoc per StringTokenizer :

StringTokenizer è una class legacy che viene mantenuta per ragioni di compatibilità anche se il suo uso è scoraggiato nel nuovo codice. Si raccomanda che chiunque cerchi questa funzionalità utilizzi il metodo split di String o il pacchetto java.util.regex.

Se si osserva String.split() e lo si confronta con StringTokenizer , la differenza rilevante è che String.split() utilizza un’espressione regolare, mentre StringTokenizer utilizza solo caratteri split letterali. Quindi, se volessi tokenizzare una stringa con una logica più complessa dei singoli caratteri (ad es. Dividere su \r\n ), non posso usare StringTokenizer ma posso usare String.split() .

  1. Tokenizer Java 10 String – non deprecato
  2. Tokenizer Java 9 String – non deprecato
  3. Tokenizer Java 8 String – non deprecato
  4. Tokenizer Java 7 String – non deprecato
  5. Tokenizer Java 6 String – non deprecato
  6. Tokenizer Java 5 String – non deprecato

Se non è contrassegnato come deprecato, non sta andando via.

StringTokenizer non è deprecato, infatti StringTokenizer è 4 volte più veloce di String.split () e nella programmazione competitiva è utilizzato da molti sviluppatori.

Fonte: – Input più veloce per Java

C’è un problema con StringTokenize …

Dividere deve usare regex, StringTokenizer sta usando String o CharSequence,

ma

"ab.".split(".") restituirà {"a","b",""}

e StringTokenizer di “ab.” … restituirà solo {“a”, “b”}

E questo è molto complicato !!! Stai attento!!!

Alternative migliori e più sicure a StringTokenizer sono:

Molto meglio StrongTokenizer è in org.apache.common.lang3 … ha molta più flessibilità o

com.google.common.base.Splitter

Non penso che la ragione di ciò sia il metodo String.split, perché split è un modo lento di analizzare la stringa – compila un pattern all’interno.

StringTokenizer può essere semplicemente sostituito con classi più funzionali come java.util.Scanner o puoi usare pattern matcher per ottenere i gruppi con espressioni regolari.

  1. StringTokenizer non è deprecato

  2. È una funzione e un’uscita poco diverse …

Ad esempio, se hai "aaa.aa.aa" e vuoi dividerlo nelle parti "aaa" , "aa" e "a" , puoi semplicemente scrivere:

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

Se usi semplicemente:

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

Restituisce una matrice vuota , perché corrisponde alle espressioni regolari in cui . è un personaggio spaziale. Quindi devi scappare:

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

Quindi in sostanza .. split ti permette di usare regex … può essere molto utile

Ma StringTokenizer analizza il testo da token … e il token può essere anche un carattere speciale

StringTokenizer è una class legacy che viene mantenuta per ragioni di compatibilità anche se il suo uso è scoraggiato nel nuovo codice. Si raccomanda che chiunque cerchi questa funzionalità utilizzi il metodo split di String o il pacchetto java.util.regex.

L’esempio seguente mostra come il metodo String.split () può essere utilizzato per suddividere una stringa nei suoi token di base:

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

Personalmente ritengo che StringTokenizer fosse deprecato perché era semplicemente un modo complesso di fare qualcosa di piuttosto semplice. StringTokenizer come il nome implica applicato solo alle stringhe, quindi perché non averlo creato come metodo in String. Ulteriori StringTokenizer non supportava RegularExpression non supporta le espressioni regolari che sono diventate estremamente comuni tra la fine degli anni ’90 e l’inizio degli anni ’00, rendendolo praticamente inutile.