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";
Bu noktaya dikkat edelim !
x = x.concat(" Rules");
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
Leave a Reply