Pure Java – 53 String – 01

Merhaba Arkadaslar,
Bu yazi ile birlikte bolum 6’ya basliyoruz. Bundan sonra konular daha da keyifli hale gelecek.

String’ler hakkinda hep soylenen bir kavram vardir ; immutable peki nedir bu String’lerin immutable olmasi ?

Stringlerin immutable olma ozelligi
Oncelikle String’ler hakkinda temel bilgileri ogrenelim. String mantigi Java’ya ozgu degildir. Diger programlama dillerinde de String kavrami soz konusudur.

  • Java’da String’in her karakteri 16-bit Unicode bir karakterdir.Bu sayede farkli karakter setlerinin gosterimi kolaylikla yapilabilir.
  • Java’da , String’ler objedir ! Unutmayalim bizim sadece 8 tane primitive tipimiz var. Bunlar ; byte, short , int , long , float , double , boolean , char dir. String primitive type degildir !

String’lerin Immutable ozelligini anlayabilmek adina ornegimizi inceleyelim.

String x = "Java";

string immutable

Bu noktaya dikkat edelim !

 x = x.concat(" Rules");

string immutable 2

x referans degiskeni , String objesini referans gostermektedir. Bu String objesinin degeri “Java” idi.

 x = x.concat(" Rules");

Ilgili “Java” objesinin degerini “Java Rules” olarak degistirmedi ! Bunun yerine “Java Rules” degerine sahip yeni bir String objesi olusturuldu. Iste, Strinlerin immutable yani degismez olma ozelligi bu anlama gelmektedir.

String’in immutable olmasi demek , String objelerinin degistirilemez olmasidir. Tabi ki String referans degiskeninin referansta bulundugu obje degisebilir.

Test.java

public class Test {
	public static void main(String[] args) {
		String x = "Java";  // "Java" degerine sahip String objesi olusur.
		x = x.concat(" Rules"); // "Java Rules" degerine sahip yeni bir String objesi olusur.
		// "Java" objesi hala heapte yasamaktadir.
		
		System.out.println("x = " + x); // Java Rules
		x.toUpperCase(); //Yeni bir obje olusur fakat  "JAVA RULES" 
		// Fakat x referans degiskeni "Java Rules" objesini referans gostermektedir.
		System.out.println("x = " + x);

	}
}

Test2.java

public class Test2 {
	public static void main(String[] args) {
		
		String s1 = "spring ";  
		// 1)"spring" degerine sahip bir String objesi olusur.
		
		String s2 = s1 + "summer ";
		// 2)"summer" objesi olusur
		// 3)"spring summer" objesi olusur
		// s2 referans degiskeni "spring summer" objesine referansta bulunur
		
		s1.concat("fall ");
		//4) "fall" degerine sahip String objesi olusur.
		//5) "spring fall" degerine sahip String objesi olusur. s1 in referans gosterdigi obje degismez !
		
		s2.concat(s1);
		//6) "spring summer spring" objesi olusur.
		
		s1 += "winter ";
		//7) "winter" degerine sahip obje olusur.
		//8)"spring winter" degerine sahip obje olusur.
		
		System.out.println(s1 + " " + s2);

	}
}


String & Memory
Bu bolumde String objelerinin Memory’deki(hafiza) durumuna inceleyecegiz. Programlama dillerinin amaclarindan birtanesi memory/hafizayi verimli(efficient) sekilde kullanmaktir.

Uygulamalar(application/proje) buyudukce String literalleri memoryde buyuk bir yer kaplayacak duruma gelir. Java bu konuda memory verimliligi(efficient) saglamak adina ozel bir memory kullanir. Bu ozel alana “String Constant Pool” denilir !

Compiler , String literali ile karsilastiginda, identical/ayni/ozdes String literali String Pool’da olup olmadigi kontrol edilir. Eger identical/ozdes String literali , String Pool’da bulunursa yeni bir String literal objesi String Pool’da olusmaz !

Ornegimizi inceleyelim ; String Poolda 2 tane obje olusur bunlar ; “levent” ve “erguder” objesidir. str ve str2 referans degiskeni “levent” objesini referans etmektedir. str3 referans degiskeni ise “erguder” referans degiskenine referans etmektedir.

Unutmayalim , str2 ‘nin referans ettigi String objesinin degeri “levent” oldugu icin ve String Pool’da bu String degeri mevcut oldugu icin ( str =”levent” degerini ilk olarak tanimladik ) yeni bir obje olusmaz!

String str = "levent";
String str2 ="levent";
String str3 = "erguder";
String s ="one";
// 1 obje olusur

String s2 = new String("two");
// new anahtar kelimesi ile String objesi olusturdugumuz zaman 2 tane
// obje olusur.
// 1) Non-pool memory (normal heap alani) de yeni bir obje olusur.
// 2) String Pool'da two objesi olusur.

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *