Char Array vs String: das ist besser zum Speichern eines Satzes von Buchstaben

7

Ich muss in einem konstanten Klasse 4-Buchstaben eines Codes speichern. Ich kann tun:

%Vor%

oder

%Vor%

Danach kann ich eines dieser Zeichen auf zwei Arten erhalten:

%Vor%

oder

%Vor%

Was ist der beste Weg ?. Bitte beachten Sie Korrektur, Leistung usw.

    
xgomez 29.04.2009, 10:33
quelle

10 Antworten

7

Leistung ist in diesem Fall irrelevant. Wenn es wirklich konstant sein soll, können Sie den Ansatz char[] nicht verwenden. Überlegen Sie:

%Vor%     
Alan Moore 29.04.2009, 10:48
quelle
8

Weder ist das falsch, aber da du mit char s individuell umgehen musst, würde ich persönlich char [] verwenden. Das heißt, die Auswirkungen auf die Performance werden vernachlässigbar, wenn auch messbar sein.

    
Eoin Campbell 29.04.2009 10:40
quelle
6

Wenn Sie das Zeichen nicht mehrere Millionen Male nacheinander abrufen, müssen Sie sich nicht um die Leistung kümmern.

    
Fredrik Mörk 29.04.2009 10:36
quelle
5

Dies ist mit ziemlicher Sicherheit eine vorzeitige Optimierung. Was auch immer Sie in der Leistung sparen, indem Sie ein Zeichen-Array verwenden, kann in der Lesbarkeit verloren gehen, wenn Sie es anderen Methoden geben müssen, da es eher üblich ist, ein String als ein char[] zu akzeptieren.

    
John Feminella 29.04.2009 10:41
quelle
5

Strings sind unveränderlich, char [] ist nicht. Wenn Sie dies als eine öffentliche "Konstante" in einer Klasse definieren, dann ist String die echte Konstante.

Zum Beispiel, wenn Sie dies haben:

%Vor%

Ich kann alles hinterhältig machen und das tun:

%Vor%

Bam, ich habe den Wert deiner "Konstante" geändert.

Das Schlüsselwort final wirkt sich nur auf den Verweis auf das Array aus und nicht auf die Array-Elemente. Ich sehe einen ähnlichen Fehler die ganze Zeit mit Collections.unmodifiableList() , Leute denken, dass sie ihre Liste schützen, aber Client-Code kann immer noch auf die Listenelemente zugreifen und sie modifizieren.

Um Ihre Frage zu beantworten, verwenden Sie die Zeichenfolge.

    
Mike Kucera 06.05.2009 19:32
quelle
2

Die Bedeutung von String entspricht wirklich einer Menge von char . So% code_% als eine Implementierung, obwohl keine Bedeutung gesetzt, würde die zusätzliche Bedeutung von char[] nicht hinzufügen. OTOH, du findest vielleicht eine nützliche Methode in String . Auf der dritten Seite hat java.util.Arrays auch nützliche Methoden wie zum Beispiel [binarySearch] [2].

Vielleicht möchten Sie eine Abstraktion für eine Menge von String einführen, die die Implementierung zwischen der Verwendung von char als der einfachsten, die möglicherweise funktionieren könnte, lineares Scannen einer String (schnell, wenn Sie nicht t Scan sehr weit), binäre Suche, Bit gesetzt. Sparse Bit gesetzt, Hashed, Hochwasser gefiltert, etc.

[2]: Ссылка , int, int, char)

    
Tom Hawtin - tackline 29.04.2009 10:56
quelle
1

Da ein String ein char [] verwendet, um Ihre Buchstaben zu halten, ist die wahre Antwort das char [] ist schneller. Wenn Sie sich im Zweifel die Quelle anschauen, gibt es in String keine Magie, es verwendet nur Primitive wie int und char [] genau wie jede andere Klasse.

Sie sollten sich wirklich nicht für etwas so Triviales interessieren. Eine Menge mehr passiert innerhalb eines Programms, das sich darüber Sorgen macht, ob ein einzelner String schneller ist als ein Char-Array.

    
mP. 29.04.2009 10:42
quelle
1

Das einzige Mal, dass Sie einen Leistungsunterschied zwischen der Zeichenfolge und dem Zeichen-Array sehen, wird unter einem Profiler sein, und nur dann, weil der Profiler das Falsche tun wird. Modernes JVMS (JDk 6+) generiert den gleichen Code für die beiden Zugriffe, sobald die JVM entscheidet, dass diese für die Optimierung heiß genug ist.

Um Ihre Frage zu beantworten; Wenn Sie Java 5 verwenden, verwenden Sie Enumerationen. Wenn Sie etwas vor Java5 verwenden, verwenden Sie das Java-Enumerationsmuster .

Es wird Ihren Code lesbarer machen, da Sie die Offsets nicht irgendwo verfolgen müssen, Sie können einfach die Enumeration verwenden. Darüber hinaus wird schneller sein, da Sie in der Lage sind, etwas zu tun wie:

%Vor%     
Paul Wagland 29.04.2009 11:14
quelle
1

Sieht so aus, als ob Sie eine enum verwenden sollten. Siehe Aufzählungstypen

    
crowne 29.04.2009 15:12
quelle
0

Lustig, ich habe gerade gestern einen Blogeintrag geschrieben . Sie benötigen eine spezielle Klasse, die um den char [] gewickelt ist. Meine Klasse Zeichen ist ein Leichtgewicht Möglichkeit, eine unveränderliche Menge von Zeichen zu behalten, und bietet hocheffiziente Methoden für Dinge wie die Suche. Es ist Open Source.

    
Garret Wilson 25.04.2011 16:56
quelle