wake-up-neo.net

Warum ist StringTokenizer veraltet?

Die Java-Dokumentation scheint nichts über die Abwertung von StringTokenizer zu erwähnen, dennoch höre ich immer wieder, wie sie vor langer Zeit nicht mehr verwendet wurde. War es veraltet, weil es Bugs/Fehler hatte, oder ist String.split() einfach besser zu verwenden?

Ich habe einen Code, der StringTokenizer verwendet, und ich frage mich, ob ich ernsthaft besorgt sein sollte, um ihn für die Verwendung von String.split() zu überarbeiten, oder ob die Abwertung eine rein praktische Frage ist und mein Code sicher ist.

47
donnyton

Aus dem Javadoc für StringTokenizer :

StringTokenizer ist eine ältere Klasse, die aus Kompatibilitätsgründen beibehalten wird, obwohl von deren Verwendung im neuen Code abgeraten wird. Es wird empfohlen, dass jeder, der diese Funktion sucht, stattdessen die Split-Methode von String oder das Java.util.regex-Paket verwendet. 

Wenn Sie String.split() betrachten und mit StringTokenizer vergleichen, besteht der relevante Unterschied darin, dass String.split() einen regulären Ausdruck verwendet, während StringTokenizer nur wortgeteilte Split-Zeichen verwendet. Wenn ich also einen String mit komplexerer Logik als einzelne Zeichen tokenisieren wollte (z. B. bei \r\n aufgeteilt), kann ich StringTokenizer nicht verwenden, aber String.split().

62
Jason S
  1. Java 10 String Tokenizer - nicht veraltet
  2. Java 9 String Tokenizer - nicht veraltet
  3. Java 8 String Tokenizer - nicht veraltet
  4. Java 7 String Tokenizer - nicht veraltet
  5. Java 6 String Tokenizer - nicht veraltet
  6. Java 5 String Tokenizer - nicht veraltet

Wenn es nicht als veraltet markiert ist, wird es nicht entfernt.

80

StringTokenizer ist nicht veraltet. StringTokenizer ist 4X schneller als String.split () und wird von vielen Entwicklern in der Konkurrenzprogrammierung verwendet.

Quelle: - Schnellere Eingabe für Java

13

Es gibt ein Problem mit StringTokenize ...

Split muss Regex verwenden, StringTokenizer verwendet String oder CharSequence,

aber

"a.b..".split(".") wird {"a","b",""} zurückgeben

und StringTokenizer von "a.b .." ... geben nur {"a", "b"} zurück

Und das ist sehr knifflig !!! Sei vorsichtig!!!

Bessere und sicherere Alternativen zu StringTokenizer sind:

Viel besser ist StrongTokenizer in org.Apache.common.lang3 ... es hat viel mehr Flexibilität oder

com.google.common.base.Splitter

1
cruiserupce

Ich denke nicht, dass der Grund dafür die String.split-Methode ist, weil das Aufteilen langsam ist, um den String zu analysieren - er kompiliert ein Muster.

StringTokenizer kann einfach durch funktionellere Klassen wie Java.util.Scanner ersetzt werden, oder Sie können Pattern Matcher verwenden, um die Gruppen durch Regex zu erhalten.

0
Andrey Krot
  1. StringTokenizer ist nicht veraltet

  2. Funktion und Ausgabe sind etwas anders ...

Wenn Sie beispielsweise "aaa.aa.aa" haben und es in die Teile "aaa", "aa" und "a" teilen möchten, können Sie einfach Folgendes schreiben:

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

Wenn Sie nur verwenden:

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

Es gibt ein leeres Array zurück, da es regulären Ausdrücken entspricht, wobei . ein Leerzeichen ist. Also musst du dem entkommen:

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

Im Grunde ... können Sie also mit "split" Regex verwenden ... das kann sehr nützlich sein

Aber StringTokenizer analysiert Text nach Token ... und Token können sogar Sonderzeichen sein

0
cruiserupce

StringTokenizer ist eine ältere Klasse, die aus Kompatibilitätsgründen beibehalten wird, obwohl von deren Verwendung im neuen Code abgeraten wird. Es wird empfohlen, dass jeder, der diese Funktion sucht, stattdessen die Split-Methode von String oder das Java.util.regex-Paket verwendet.

Das folgende Beispiel zeigt, wie die String.split () - Methode verwendet werden kann, um eine Zeichenfolge in ihre grundlegenden Token aufzuteilen:

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