2012-10-16 13 views
6

Poniżej konstruktor String klasyJak może się zdarzyć "originalValue.length> size" w konstruktorze String?

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; 
} 

Ale zastanawiam się, jak

if (originalValue.length > size) 

może się zdarzyć? Komentarz mówi: "przyciąć bagaż", do czego odnosi się bagaż?

+3

Zobacz inne konstruktory i metody tej klasy String. Czy istnieje sposób na utworzenie łańcucha z większą przydzieloną przestrzenią w tablicy niż to, co jest potrzebne dla rzeczywistej zawartości? –

Odpowiedz

4

Zobacz podłańcuch, a zobaczysz, jak to się może stać.

Weź na przykład String s1 = "Abcd"; String s2 = s1.substring(3). Tutaj s1.size() ma wartość 1, ale s1.value.length ma wartość 4. Wynika to z faktu, że wartość s1.jest taka sama jak wartość parametru s2.value. Odbywa się to z powodów związanych z wydajnością (podłańcuch działa w O (1), ponieważ nie musi kopiować zawartości oryginalnego ciągu).

Stosowanie podłańcucha może prowadzić do wycieku pamięci. Powiedzmy, że masz naprawdę długi String, a chcesz tylko zachować niewielką jego część. Jeśli użyjesz tylko podłańcucha, zachowasz oryginalną treść ciągu w pamięci. Wykonanie String snippet = new String(reallyLongString.substring(x,y)), zapobiega marnowaniu pamięci, która nie jest już potrzebna.

Więcej informacji można znaleźć również pod adresem What is the purpose of the expression "new String(...)" in Java?.

+1

W 'String s1 =" abcd "; String s2 = s1.substring (3) ', s1, s2 faktycznie posiadają tę samą tablicę wartości' {'a', 'b', 'c', 'd'} '. Różnica między nimi wynosi ** offset ** i ** count **. Metoda String (String.substring (...)) może uniknąć przecieku pamięci przy próbie pobrania podciągu dużego. Dzięki ~ – sun

Powiązane problemy