2012-10-16 4 views
6

Das folgende ist ein Konstruktor String KlasseWie konnte 'originalValue.length> size' im String-Konstruktor passieren?

public String(String original) { 
int size = original.count; 
char[] originalValue = original.value; 
char[] v; 
if (originalValue.length > size) { 
    // The array representing the String is bigger than the new 
    // String itself. Perhaps this constructor is being called 
    // in order to trim the baggage, so make a copy of the array. 
     int off = original.offset; 
     v = Arrays.copyOfRange(originalValue, off, off+size); 
} else { 
    // The array representing the String is the same 
    // size as the String, so no point in making a copy. 
    v = originalValue; 
} 
this.offset = 0; 
this.count = size; 
this.value = v; 
} 

Aber, frage ich mich, wie

if (originalValue.length > size) 

passieren könnte? Der Kommentar sagt 'trim das Gepäck', was bedeutet Gepäck beziehen?

+3

Schauen Sie sich die anderen Konstruktoren und Methoden dieser String-Klasse an. Gibt es eine Möglichkeit, eine Zeichenfolge mit einem größeren zugewiesenen Speicherplatz im Array zu erstellen, als für den eigentlichen Inhalt benötigt wird? –

Antwort

4

Werfen Sie einen Blick auf Teilstring, und Sie werden sehen, wie dies passieren kann.

Nehmen Sie zum Beispiel String s1 = "Abcd"; String s2 = s1.substring(3). Hier ist s1.size() ist 1, aber s1.value.length ist 4. Dies liegt daran, s1.value ist das gleiche wie s2.value. Dies geschieht aus Performancegründen (der Teilstring läuft in O (1), da der Inhalt des ursprünglichen Strings nicht kopiert werden muss).

Die Verwendung von Teilstrings kann zu einem Speicherverlust führen. Nehmen wir an, Sie haben einen wirklich langen String, und Sie möchten nur einen kleinen Teil davon behalten. Wenn Sie nur Teilzeichenfolge verwenden, behalten Sie den ursprünglichen Zeichenfolgeninhalt im Speicher. Doing String snippet = new String(reallyLongString.substring(x,y)), verhindert, dass Sie Speicher verschwenden, der ein großes Char-Array unterstützt, das nicht mehr benötigt wird.

Siehe auch What is the purpose of the expression "new String(...)" in Java? für weitere Erklärungen.

+1

In 'Zeichenfolge s1 =" abcd "; String s2 = s1string (3) ', s1, s2 enthalten tatsächlich das gleiche Array '{' a ',' b ',' c ',' d '}. Der Unterschied zwischen ihnen ist ** Offset ** und ** Count **. String (Stringstring (...)) -Methode kann Speicherverlust vermeiden, wenn Sie versuchen, Teilstring eines großen zu erhalten. Danke ~ – sun