Ile obiektów może zostać usuniętych przez garbage collector po wykonaniu ostatniej linii poniższego pseudokodu?
String a = "test";
String b = new String("test");
a = b = null;
Prawidłowa odpowiedź to: jedna (obiekt wskazywany przez referencję b)
Wynika to ze specyficznej obsługi typu obiektów typu String:
- obiekty typu string są niemodyfikowalne (Immutable),
- literały tworzone taki sposób jak “a” umieszczane są na etapie ładowania klasy w String literal pool
- użycie operator new wymusza utworzenie nowego obiektu String, dla który jednak wewnątrz posiada ten sam literał (“intern“)
String a = "test";
String b = new String("test");
System.out.println(a==b); // false
System.out.println(a.intern()==b.intern()); //true
Teraz trochę dywagacji (niesprawdzonych). Czy string utworzony w poniższy sposób również ląduje w string literal pool?
byte[] bs = { 'a', 'b', 'c' };
String b = new String(bs);
b = null; // czy gc może usunąć ref do b.intern() ?
Wydaje się tak, ponieważ:
byte[] bs = { 'a', 'b', 'c' };
String a = new String(bs);
String b = new String(bs);
System.out.println(a.intern() == b.intern()); // true - sugeruje to, że w momencie tworzenia obiektu <em>a</em>, do puli trafił string "abc"
COMMENTS
No Comments