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.
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()
.
Wenn es nicht als veraltet markiert ist, wird es nicht entfernt.
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
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
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.
StringTokenizer ist nicht veraltet
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
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");