2010-06-02 16 views
5

aşağıdaki koduSabit olduğunda Dizeler oluşturuldu/yok edildi mi? Bu Strings oluşturulduğunda

public static void method(String[] srgs){ 
try{ 

}catch(){ 
System.out.println("Hello World" + "one");} 
catch(..){ 
System.out.println("Hello World" + "two");} 
catch(..){ 
System.out.println(getString());} 
} 
  1. düşünün? Çalışma zamanında bir Özel Durum oluştuğunda Dizelerin oluşturulacağını farz ediyorum. Dize çalışma zamanında oluşturulur ve görüntülenir. Bir eşim bana bunların sabit dizeler olduğundan, sınıf yükler yüklenmez yaratılacağını söylüyor. Bu doğru mu?

  2. Dizeler çöpe ne zaman toplanır? Çöp toplanmış mı? Aynı yöntemin programlarda defalarca çağrılabileceğini varsayarsak, bunları sadece önbelleğe almak anlamlı olmaz mı?

cevap

6
  1. Bu dize aslında sabit dize olan ve sınıfının sürekli havuzda olacak ve sınıf yüklendiğinde böylece JVM örneği olacaktır. + ile yaratıldıkları gerçeği, tüm String hala sabit bir ifade olduğu için önemli değildir (yani, "Hello Worldone" ve "Hello Worldtwo" yazdıklarınızla aynı olurdu). Bu kurallar JLS'nin § 3.10.5 String Literals sayılı belgede açıklanmıştır. Nesneler çöp toplanırsa aynı şekilde toplanan çöpler gibi toplanan çöpler de aynı şekilde farklı bir şey yoktur. Bununla birlikte,some String are interned (en önemlisi bu, tüm dizgi değişmezlerini içerir), bunların çöp toplanmasını engellemek veya engellememek (tanımlanmamış ve uygulamaya bağlı).

    Sınıfınız yüklü kaldığı sürece, bu String sabitleri var olmaya devam edecek ve çöp toplanmayacaktır.

+0

Teşekkürler Joachim, SOP'u ("Hello World" + getstr()) düşünün, bu durumda hala oluşturulmuş sabit bir String var mı? Bu satır yürütüldüğünde 2. String oluşturuldu mu? 2. String Çöp Toplanıyor mu? Lütfen bana 1. noktayı cevapladığınız yerden bir kaynak verebilir misiniz? – Geek

+1

JLS'nin ilgili bölümünü bağladım. “HelloWorld” + getstr() '** **' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' dır. Satır her yürütüldüğünde yeni bir 'String' nesnesi üretilir ve bu nesne normal olarak toplanan çöptür. –

+0

@JoachimSauer "HelloWorld" durumu + getstr() 1.Sınıf yüklendiğinde hala "HelloWorld" oluşturulacak mı? 2. Eğer toplanan çöpün dizgisini durdurmak istemezsek, yeni String ("HelloWorld") yardımcı olur mu? – Jaskey

İlgili konular