Skip to main content

Java Dilinde Stringler ve Performans

javaHerkese merhabalar. Uzun sayılabilecek bir aradan sonra tekrardan blogda yazacak fırsat bulmanın sevincini yaşıyorum. Zorlu bir sınav dönemini atlattıktan sonra yavaş yavaş bir şeyler paylaşmaya devam edebiliriz. Bu yazımda sizlerde String tipinden bahsedeceğim. Java String tipi diğer dillere oranla farklılıklar gösterir. Bunu örneklerle anlaşılır bir biçimde irdelemeye çalışacağız.

Bu konuda bilmemiz gereken ilk şey Java Dilinde String tipinin aslında bir sınıf tanımlaması olduğudur. Ve birden farklı biçimde oluşturulabilirler.


public class StringDeneme {

	public static void main(String[] args) {
		  String s1 = new String("Bu ilk oluşturma biçimim..");
		  String s2 = "Buda ikinci string oluşturma biçimim";
		  System.out.println(s1);
		  System.out.println(s2);

	}

}

Görüldüğü gibi Stringler birden farklı bir biçimde elde edilebiliyor. Stringler Java dilinde diğer tiplere göre farklı davranırlar demiştik. Bunu hemen bir kodla açıklayalim ve performans açısından bu durumu irdeleyelim.


public class StringDeneme {

	public static void main(String[] args) {
		  String s1 = new String("Aytaç");
		  String s2 = new String(" Cici");
		  String s3 = s1+s2;
		 System.out.println(s3);

	}

}

Yukarida ki kodu göz önüne alacak olursa iki adet String tanımlanmıi ve bu iki string  + operatörüyle birleştirilmiştir. İşte bu işlem Java’da dikkat edilmesi gereken işlemlerden bir tanesidir. Peki neden ? Çünkü Java bu birleştirme işlemini bizlerin tahmin ettiği bir biçimde yapmaz. Eğer biz bu işlemi yapıyor olsaydık , muhtemelen s1 isimli stringin sonuna s2 isimli stringi direk ekleyecek ve bu işlemi çabucak halletmiş olacaktık.Fakat Java bu konuda böyle davranmaz.  Çünkü daha önce dile getirdiğim gibi Stringler aynı bir yere sahiptir ve  şu özellikleri gösterirler.

  • Aslında Javada String değerleri değişmezdir,  yani değer ataması sonrası bile   o değer değişmez.  
  • Her birleştirme işlemi hafızada yeni bir String objesi oluşturularak yapılır.
  • String metodlardan dönen değerler  başka bir string değişken tarafından tutulmalıdır, aksi durumda String kaybolur.

Şimdi bu dediklerimizin ne anlama geldiğini bizim verdiğimiz örnekle birlikte acıklayalım.


public class StringDeneme {

	public static void main(String[] args) {
		  String s1 = new String("Aytaç");
		  String s2 = new String(" Cici");
		  String s3 = s1+s2;
		 System.out.println(s3);

	}

}

s1 ve s2  isimli String için hafızadan yeni bir bellek  alanı ayrılmıştır.   ve  s1+s2 islemi yapmak için  kullanılan + operatörü de aslında hafızadan yeni bir bellek alanı ayırmıştır.  Örneğin biz  s1 isimli stringimizin 2 Megabyte , s2 isimli stringimizin ise 4 Megabyte yer kapladıklarını varsayalım.  biz  aslında  + islemi yaptımızda bellekte  s1 + s2 ‘nin kapladıgı alan kadar  yeni bir alan işgal edilir.  Yani bizim örneğimiz için  2+4 = 6 Megabyte bir alan söz konusudur.   Sonra oluşturulan bu yeni Stringinde başka bir yeni Stringde tutulması gerekir .  Çünkü  Javada String değerleri değişmezdir,  yani değer ataması sonrası bile   o değer değişmez kuralı hala geçerlidir.   Bu durumda yeni bir String tanımlanmalı ve bu s1+s2 işleminin sonucu kendisine atanmalıdır. Buda bize ek 6 Megabyte bir alan daha gerektirir.

Tüm bunları göze aldığımızda özellikle büyük çaplı projelerde  bu tip String işlemleri bize çok fazla bellek maliyeti getirecek ,  ve bazen programlarımızın çalışmaz hale gelmesine bile neden olabilecektir. Çok daha gerçekci bir  örnek verecek olursak. Akıllı telefonlar  için bir uygulama geliştirdiğimizi düşünelim . Eğer uygulamamızda bu tip String işlemleri fazlasıyla geçiyorsa ve telefonun da belleğinin kısıtlı olduğunu varsayarsak   hafıza dolacak ve program işlemez hale gelecektir.  Bu   kesinlikle istenmeyen bir durumdur. Peki bunun önüne nasıl geçebiliriz ?

Java bu  performans kaybını önlemek için bizlere StringBuffer ve StringBuilder nesnelerini sunar.  Bu iki sınıfta aslına  aynı işlemi yapar, ama Java 5 ‘ten sonra StringBuilder sıklıkla kullanılmaya başlanmıştır. Bende örneğimde  StringBuilder nesnesini kullanacağım .


public class StringDeneme {

	public static void main(String[] args) {
		  StringBuffer s1 = new StringBuffer("Aytaç");
		  s1.append(" Cici");
		  System.out.println(s1);

	}

}

Görüldüğü gibi her String Builder nesnesi bir String gibi davranır ve kendisine haz bir takım metodları vardır.Örneğin biraz önce verdiğimi örnekte büyük performans kayıplari yaşayarak yaptığımız birleştirme işlemini append metodu ile sıkıntısız ve performans kaybı olmadan yapabiliyoruz. Yukarıda ki kod örneği s1+s2 işleminin döndürdügü sonucu döndürür ve bunu yaparken performans kaybı yaşanmaz.

String sınıfı tabiki bu kadarla sınırlı değil. Bir çok özelliğe sahip bu sınıfı ileryen günlerde ayrıca incelemeyi düşünüyorum. Fakat bu anlattığım konu bana çok ilginç gelmişti ve sizlere de bu ince nüansı paylaşmak istedim.

Görüşmek dileğiyle..

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Aytaç Cici

İstanbul Üniversitesi Bilgisayar Mühendisliği mezunu bir Yazılım Geliştirici. Çeşitli zamanlarda Java, PHP, C# ve Delphi gibi diller kullanarak yazılım geliştirmiştir. Bir dönem SEO alanında da çalışmalar yapmıştır.

Java Dilinde Stringler ve Performans” hakkında 4 yorum

  1. Hocam ne çok konuda bilginiz var. Maşallah tebrik ederim. Siteniz dolu dolu. Bizim sitemize de bekleriz. Mutlaka öğreneceğiniz şeyler vardır.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Email
Print