Java Planet

O Javie i jej otoczeniu

String literals

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"

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

COMMENTS

No Comments

There are no comments posted yet. Be the first one!

Leave a Replay