Java’da String Nesneleri Değişmez

2074 kez okundu.

İşin teorisinden önce küçük bir kod parçası hakkında düşünelim.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test{
 
	public static void main(String[] args){
 
		String s1 = new String("Mustafa");
 
		String s2 = new String("Çil");
 
		s1.concat(s2);
 
		System.out.println(s1);
 
        }
}

Sizce bu kodun çıktısı ne olur?

Şaşırtıcı ama bu kodun çıktısı “MustafaÇil” olmaz. Çıktı “Mustafa” olur. Peki ne oldu? String değerleri birleştiren concat() metodunu çağırdık fakat çıktı “MustafaÇil” olmadı.

Şimdi nedenlerine bakalım. Aslında java.lang.String sınıfındaki concat() metodunun implementasyonuna bakarsak bir şeyler anlayabiliriz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public String concat(String str){
 
        int otherLen = str.length();
 
        if (otherLen == 0) {
 
            return this;
 
        }
 
        int len = value.length;
 
        char buf[] = Arrays.copyOf(value, len + otherLen);
 
        str.getChars(buf, len);
 
        return new String(buf, true);
 
}

Görüldüğü gibi;

public String concat(String str)

metodu, uzunluğu(length) 0 olan bir String kendisine parametre olarak geçilmedikçe işini bitirdikten sonra

return new String(buf, true);

satırıyla yeni bir String objesi üretip döndürüyor. Şimdi biraz daha ayrıntıya inelim ve şekil üzerinden ne olduğunu inceleyelim.

StringlerDeğişmez

 

 

 

 

 

 

 

 

s1  referans değişkeni üretildi ve “Mustafa” String nesnesini gösteriyor. Aynı şekilde s2 referans değişkeni üretildi ve “Çil” String nesnesini gösteriyor.

Şimdi s1.concat(s2); metodunu çağırınca ne oluyor bir bakalım:

  • Siz bu metodu çağırdığınızda iki String objesi birbirlerine eklenerek yeni bir String objesini üretir ve bu objenin değeri “MustafaÇil” olur.
  • Burada “Mustafa” objesinin değişmediğini “MustafaÇil” objesinin yeni bir obje olarak üretildiğini görmemiz çok önemli.
  • “MustafaÇil” String objesi üretildi fakat bu objeyi herhangi bir referans göstermediği için bu obje kayıp durumda.

StringlerDeğişmez2

Şimdi kodumuzdaki s1.concat(s2) satırını s1 = s1.concat(s2) olarak değiştirelim ve programımızı tekrar çalıştıralım.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test {
 
    public static void main(String[] args) {
 
    String s1 = new String("Mustafa");
 
    String s2 = new String("Çil");
 
    s1 = s1.concat(s2);
 
    System.out.println(s1);
 
    }
}

Şimdi ise “MustafaÇil” olarak ekrana basıldı.

  • s1.concat(s2); satırı yeni bir obje üretti.
  • s1 = s1.concat(s2); satırı bu objeyi s1 referansına atadı.
  • Şuan s1 referansı “MustafaÇil” nesnesini göstermekte dolayısıyla şuan “Mustafa” nesnesini herhangi bir referans göstermemektedir.

Tekrar şekilde bakacak olursak;

StringlerDeğişmez3

Kısacası String nesneler üzerinde eklemeler yaparsanız yeni objeler oluşturursunuz. Bu durum performans açısından olumsuz bir durumdur ve String nesneleri üzerinde değişiklik yapıyorsak StringBuilder veya StringBuffer sınıflarını append() metodlarıyla kullanmalıyız.

You may also like...

4
Yorum Yazın

avatar
2 Comment threads
2 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
3 Comment authors
Mustafa ÇilTekinadminMehmet Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
Mehmet
Guest
Mehmet

Faydalı bir yazı olmuş emeğinize sağlık

Tekin
Guest
Tekin

Olayi anlamamda cok ise yaradi, cok tesekkurler.