Grudzień 31, 2018

Java pytanie rekrutacyjne: String pool

Czym jest String Pool?

String pool jest specjalnym miejscem w pamięci, do którego trafiają niektóre obiekty typu Stringi – dokładnie te, które nie są tworzone poprzez użycie operatora new.

String pool został stworzony w celu optymalizacji JVM, dzięki niemu wiele obiektów Stringów o tej samej wartości wskazują na ten sam obszar pamięci. Co nam to daje?

M.in. zapewnia mniejsze zużycie pamięci – w końcu String jest zazwyczaj najszczęściej używanym typem w Javie. Dodatkowo przyśpiesza to porównywanie Stringów – jest duże prawdopodobieństwo, że kilka obiektów wskazuje na ten sam obszar pamięci. Skoro mają tą samą referencję to dalsze porównywanie jest zbędne.

Przykład

Obecność String Poola można zauważyć już na bardzo prostym przykładzie.

Mamy następujące 4 Stringi:

public class Main {

  public static void main(String[] args) {
    String pablo1 = "pablo";
    String pablo2 = "pablo";
    String pablo3 = new String(pablo1);
    String pablo4 = new String(pablo2);

    System.out.println(pablo1 == pablo2);
    System.out.println(pablo3 == pablo4);
    System.out.println(pablo1.equals(pablo3));
    System.out.println(pablo3.equals(pablo4));
  }	

}

Rezultat działania takiego programu:

true
false
true
true

Zauważ, że porównanie pablo1 i pablo2 przy użyciu operatora == zwraca nam prawdę, lecz gdy porównamy pablo1 i pablo3 (utworzony przez new) to zwraca już fałsz.

Dzieje się, tak ponieważ operator == sprawdza referencję obiektów (nie ich zawartość) – w pierwszym przypadku, otrzymujemy prawdę, ponieważ oba obiekty wskazują na ten sam obszar w pamięci. Zaś w drugim przypadku pomimo tego, że Stringi są takie same to operator == sprawdza tylko adresy, które są różne.