Java Scanner vs String.split () - vs StringTokenizer; welches sollte ich nutzen?
Ich bin derzeit mit split()
zu durchsuchen, eine Datei wo in jeder Zeile die Anzahl der Zeichenfolgen getrennt durch '~'
. Ich habe irgendwo gelesen, dass Scanner
tun könnte einen besseren job mit einer langen Datei -, performance-Weise, also habe ich mir überlegt, es heraus zu überprüfen.
Meine Frage ist: Würde ich erstellen Sie zwei Instanzen von Scanner
? Das heißt, ein, eine Zeile Lesen und ein anderes basierte auf der Linie zu erhalten Wertmarken für ein Trennzeichen? Wenn ich zu tun haben, so bezweifle ich, wenn ich keinen Vorteil aus der Verwendung von es. Vielleicht bin ich hier etwas fehlt?
InformationsquelleAutor | 2009-04-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben einige der Metriken, um diese in einem einzelnen Thread-Modell und hier sind die Ergebnisse, die ich bekam.
Dem rausgekommen ist, dass der Scanner bietet die beste Leistung, Jetzt die gleichen Bedürfnisse werden ausgewertet, auf einem Multithread-Modus ! Einer meiner älteren sagen, dass der Segmentierer gibt eine CPU-Spitze und String.split nicht.
InformationsquelleAutor Sreesankar
Für die Verarbeitung von Linie, die Sie verwenden können scanner und Token von jeder Zeile, die Sie verwenden können, aufgeteilt.
InformationsquelleAutor Jerrish Varghese
Können Sie die
useDelimiter("~")
Methode, damit Sie eine Iteration durch die tokens in jeder Zeile mithasNext()/next()
, während immer noch mithasNextLine()/nextLine()
zu Durchlaufen und die Zeilen selbst.EDIT: Wenn du gehst zu tun, eine Leistung Vergleich, sollten Sie die vor-kompilieren der regex, wenn Sie die split () - test:
Wenn Sie
String#split(String regex)
der regex wird neu kompiliert werden, jedes mal. (Scanner automatisch speichert alle regexes das erste mal kompiliert.) Wenn Sie das tun, würde ich nicht erwarten, zu sehen, viel Unterschied in der Leistung.InformationsquelleAutor Alan Moore
Ich würde sagen
split()
ist am schnellsten, und wahrscheinlich auch gut genug für das, was du tust. Es ist weniger flexibel alsscanner
obwohl.StringTokenizer
ist veraltet und wird nur für die Abwärtskompatibilität, so verwenden Sie es nicht.EDIT: Man könnte testen Sie immer beide Implementierungen zu sehen, die man schneller ist. Ich bin selber neugierig, wenn
scanner
schneller sein könnte alssplit()
. Split könnte schneller sein, für eine gegebene Größe VSScanner
, aber ich kann nicht sicher sein, dass.StringTokenzier ist nicht veraltet...
Du hast Recht, das ist es nicht. Aber aus der API: StringTokenizer ist ein Vermächtnis Klasse, beibehalten aus Gründen der Kompatibilität obwohl seine Verwendung wird abgeraten, in die der neue code. Es wird empfohlen, dass alle, die diese Funktionalität verwenden Sie die split-Methode der String oder java.util.regex-Paket statt.
InformationsquelleAutor CookieOfFortune
Braucht man eigentlich nicht eine regex hier, weil Sie die Teilung auf eine Feste Zeichenfolge. Apache
StringUtils
split hat die Teilung auf reinen strings.Für hochvolumige splits, wo die Spaltung ist das Nadelöhr, anstatt zu sagen, Datei IO, ich habe festgestellt, dass dies bis zu 10 mal schneller als
String.split()
. Aber ich habe nicht testen Sie es gegen ein regex kompiliert.Guave hat auch einen splitter, umgesetzt in einer mehr OO Weg, aber ich fand es war deutlich langsamer als die StringUtils für hochvolumige splits.
InformationsquelleAutor BeeOnRope