Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Beim Java-Lernen stosse ich immer wieder auf Byte Arrays, die anscheinend oft Strings (meine damit nicht bloss String-Objekte, sondern auch StringBuilder und andere Klassen, die String-basiert arbeiten) vorgezogen werden.
Unter welchen Umständen sollte ich eher Byte Arrays verwenden? - Ich habe einiges zur Performance-Optimierung gelesen, aber Vergleiche von Byte-Arrays mit Strings waren da nie erwähnt.
Arbeiten alle String-basierten Klassen im Hintergrund mit Char-Arrays?
In den meisten meiner Anwendungsfälle werde ich jedenfalls nicht mit fixen String-Längen (also auch nicht mit fixen Array-Größen) arbeiten (können). Sind unter diesen Umständen Strings zu bevorzugen?
Das Problem bei Strings ist, dass aufgrund ihrer UTF-8 Codierung jeder Character variable Länge hat (1-4 Byte). Sprich ein Buchstabe/Zeichen hat nicht immer die gleiche Länge. U.a. deshalb kann man Strings auch nicht ändern, dafür sind ja die Klassen StringBuffer/Builder.
Zu deiner Frage: Willst du wissen, ob du anstatt Strings zu benutzen, lieber Char-Arrays nehmen sollst oder gar Byte-Arrays und dir eine String-Klasse selber schreiben? Davon ist abzuraten. Die Klasse StringBuilder wirst du kaum selber besser implementieren können. Und was sollen Char Arrays bringen? Sie nehmen mehr Speicher weg und die Compiler-Optimierung, die es für den klassischen String gibt, gibt es für dein Char-Array nicht. Folgendes Szenario:
1. Du erstellt ein Char Array, hast es nicht vor, zu verändern.
2. Du machst das gleiche mit dem selben Inhalt.
Jetzt hast du das gleiche zweimal im Speicher. Bei einem String (der ja konstant ist), optimiert der Compiler das ganze so, dass die Bits nur einmal im Speicher liegen.
String arbeitet im Hintergrund mit einem char Array
Code:
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
in wie weit man jetzt bei der täglichen Arbeit Strings noch optimieren soll, (ausser natürlich die verkettung in schleifen....) kann nicht nicht sagen.
Wir bewegen uns hier im milisekunden Bereich, also ich verwende niemals ein byte array statt eines strings...
Der Compiler hat mit der Speicherverwaltung von Strings nichts zu tun. Es ist auch abhängig von der Implementierung der VM. Es kann sein dass String-Konstanten speicher-optimiert verwendet werden, es muss aber nicht sein.
Die Speicheroptimierung wird auch nur dann verwendet, wenn man String-literale verwendet.
Probiers aus:
Code:
String s = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s == s2);
System.out.println(s == s3);
Zu deiner Frage: Willst du wissen, ob du anstatt Strings zu benutzen, lieber Char-Arrays nehmen sollst oder gar Byte-Arrays und dir eine String-Klasse selber schreiben?
Ja, die Frage ist, ob (bzw. in welchen Fällen) ich lieber Char- oder Byte-Arrays benutzen sollte statt Strings und nein, ich will mir die String-Klasse gewiss nicht selber schreiben.
Mir ist nur nicht ganz klar, wann was besser ist, ganz besonders unklar ist es mir zB bei StringBuilder und Byte-Array - wo liegt da der Vorteil bei Byte-Arrays. Am ehesten denke ich mir, kann es nur dann einen Vorteil beim Byte-Array geben, wenn ich genau weiss, wieviele Elemente ich in meinem Array haben werde. Für alle Anwendungen, wo variable Längen von Datenströmen auftreten, sehe ich keinen Vorteil von Byte-Arrays.
Pappenheimer++ hat gesagt.:
Das Problem bei Strings ist, dass aufgrund ihrer UTF-8 Codierung jeder Character variable Länge hat (1-4 Byte). Sprich ein Buchstabe/Zeichen hat nicht immer die gleiche Länge. U.a. deshalb kann man Strings auch nicht ändern, dafür sind ja die Klassen StringBuffer/Builder.
Das ist ja eigentlich auch ein Nachteil von den Byte-Arrays - da müsste ich mich selber um die Codierung kümmern. Byte Arrays nützen mir dann nur was, wenn ich wirklich definitiv byteweise zugreifen will - vielleicht ist das auch DIE Anwendung für Byte-Arrays.