2010-09-06 20 views
14

String str = new String("SOME") ve String str="SOME" arasındaki fark nedir? Bu bildirimler performans değişkeni verir mi.Java Dize beyanı

+0

Ayrıca bkz. Http://stackoverflow.com/questions/334518/java-strings-string-s-new-stringsilly ve http://stackoverflow.com/questions/390703/what-is-the-purpose-of -the-expression-new-string-in-java – polygenelubricants

cevap

29
String str = new String("SOME") 

hep

String str="SOME" 

String pool

bu küçük örneği deneyin kullandığı yığın yeni bir nesne oluşturun:

 String s1 = new String("hello"); 
     String s2 = "hello"; 
     String s3 = "hello"; 

     System.err.println(s1 == s2); 
     System.err.println(s2 == s3); 

yığın kullanımı hakkında Gereksiz nesneleri oluştururken önlemek için ikinci form.

9

hem arasında küçük bir fark vardır.

İkinci beyan değeri sabit SOME arasında değere sahip bir yeni String oluşturur değişken str

ilk beyan sabit SOME ilişkili referans assignates ve değişken str olan referans assignates. İlk durumda

, ikinci bir dize daha inititialization süresi gerektirir SOME aynı değere sahip oluşturuldu. Sonuç olarak, bundan kaçınmalısınız. Ayrıca, derleme zamanında, tüm sabitler SOME, daha az bellek kullanan aynı örneğe dönüştürülür.

bir sonucu olarak, her zaman ikinci bir sözdizimi tercih ederim.

+3

Kayıt için, çok büyük bir dizeniz varsa ve yalnızca küçük bir alt dizgiyi korumakla ilgiliyseniz, yeni String (String) 'in anlam ifade ettiği senaryolar vardır. . 'Substring' yöntemleri yalnızca orijinal dizgenin sineğlenim görünümünü döndürür, böylece' new String (hugeString.substring (a, b)) 'kullanarak bir kopyasını zorlar ve GC'nin" hugeString "in içeriğini geri çektiğinde kapsamı. Gerçi bir kurucu yapmamalılardı, ama ... – gustafc

+0

Gerçekten de optimizasyon için ilginç bir durum, ama bazı profiler kontrolleri yapmadan önce bu yola gitmeyecektim (sanırım). – Riduidel

0

İlki yığın yeni bir String nesnesi oluşturur ve str bunu sevk edecektir. Ayrıca literal ayrıca String havuzuna yerleştirilecektir. 2 nesne oluşturulacak ve 1 referans değişkeni demektir.

İkinci seçenek sadece havuzda dize literal yaratacak ve str bunu sevk edecektir. Dolayısıyla sadece 1 Nesne oluşturulacak ve 1 referans oluşturulacaktır. Bu seçenek, her yürütüldüğünde yeni bir tane oluşturmak yerine, her zaman String havuzundan örneği kullanır.