Java'daki tüm argümanlar değere göre iletilir. Bir String
işleve bir ilettiğinizde , iletilen değer bir String nesnesine başvuru olur, ancak bu başvuruyu değiştiremezsiniz ve temeldeki String nesnesi değiştirilemez.
Görev
zText += foo;
şuna eşittir:
zText = new String(zText + "foo");
Yani, (yerel olarak) parametreyi zText
yeni bir referans olarak yeniden atar , bu yeni bir bellek konumuna işaret eder, burada ekli ile String
orijinal içeriğini içeren yeni bir bellektir .zText
"foo"
Orijinal nesne değiştirilmez ve main()
yöntemin yerel değişkeni zText
yine de orijinal (boş) dizeyi gösterir.
class StringFiller {
static void fillString(String zText) {
zText += "foo";
System.out.println("Local value: " + zText);
}
public static void main(String[] args) {
String zText = "";
System.out.println("Original value: " + zText);
fillString(zText);
System.out.println("Final value: " + zText);
}
}
baskılar:
Original value:
Local value: foo
Final value:
StringBuilder
Dizeyi değiştirmek istiyorsanız, belirtildiği gibi veya AtomicReference
işaretçi dolaylaması ek düzeyi veren bir kap (dizi veya bir veya özel kap sınıfı) kullanabilirsiniz. Alternatif olarak, yeni değeri döndürüp atamanız yeterlidir:
class StringFiller2 {
static String fillString(String zText) {
zText += "foo";
System.out.println("Local value: " + zText);
return zText;
}
public static void main(String[] args) {
String zText = "";
System.out.println("Original value: " + zText);
zText = fillString(zText);
System.out.println("Final value: " + zText);
}
}
baskılar:
Original value:
Local value: foo
Final value: foo
Bu muhtemelen genel durumdaki en Java benzeri çözümdür - Etkili Java öğesi "Değişmezliği destekle" konusuna bakın .
Belirtildiği gibi, StringBuilder
genellikle size daha iyi performans verecektir - özellikle bir döngü içinde yapacak çok fazla ekiniz varsa kullanın StringBuilder
.
Ancak, mümkünse değişmez Strings
yerine geçmeye çalışın StringBuilders
- kodunuzun okunması daha kolay ve daha sürdürülebilir. Parametrelerinizi oluşturmayı final
ve IDE'nizi, bir yöntem parametresini yeni bir değere yeniden atadığınızda sizi uyaracak şekilde yapılandırmayı düşünün .