Java’da String Sınıfı
Herkese merhabalar. Bugün ki yazımızda String,String Builder ve String Buffer sınıflarını detaylı anlatacağız.
String sınıfı ile daha hızlı çalışan StringBuilder, metotları sekronize olmayan StringBuffer sınıflarını anlataçağız.
String Sınıfı
String sınıfı oluşturulduktan sonra asla değiştirilemez.Peki string nesnesi değişiyormuş gibi görünüyor acaba bu nasıl oluyor?
String Sınıfının özellikleri
■String sınıfı değişmez bir nesnedir.
■ String sınıfı her karakter 16 bit unicode karakterdir.Bu sayade zengin, uluslararası bir karakter kümesi Unicode’da kolayca temsil edilir.
■String classları nesnelerdir.Tıpkı diğer nesneler gibi, aşağıdaki gibi new anahtar kelimesiyle bir String örneği oluşturabilirsiniz.
String s = new String();
■Bu kod satırı, String sınıfının yeni bir nesnesini oluşturur ve onu s referans değişkenine atar.String
nesneleri tıpkı diğer nesneler gibidir. Şimdi String’e bir değer verelim.
String s = “abcdef”;
■String classlarına iki tırnak arasında değer atayarak da oluşturabiliriz.Oluşturduğumuz s string sınıfını s2 string classına eşitleyelim.
String s2 = s;
Önemli Not:String Sınıfı final olarak işaretlenmiştir.Bu sayade string metotları override edilemez.
String sınıflarında memory yönetimi nasıl oluyor?
Java’nın bellekteki String nesnelerini nasıl işlediğini ve bu davranışların arkasındaki bazı nedenleri anlatalım. Herhangi bir iyi programlama dilinin temel hedeflerinden biri, belleği verimli kullanmaktır.
Uygulamalar büyüdükçe, String değişmezlerinin bir programın belleğinin büyük miktarlarını işgal etmesi çok yaygındır ve bir program için String değişmezleri evreninde genellikle çok fazlalık vardır. Java’yı belleği daha verimli hale getirmek için, JVM, “Dize sabit havuzu” adı verilen özel bir bellek alanı ayırır.
Derleyici bir String değişmeziyle karşılaştığında, aynı bir String’in zaten var olup olmadığını görmek için havuzu kontrol eder. Bir eşleşme bulunursa, yeni değişmez değere yapılan başvuru, mevcut String’e yönlendirilir ve yeni bir String değişmez değeri nesnesi oluşturulmaz.
Birkaç referans değişkeni farkında olmadan aynı String’e atıfta bulunuyorsa, bunlardan herhangi birinin String’in değerini değiştirebilmesi çok kötü olur. Dize sınıfı işlevselliği; bu havuzda sorunlara neden olamaz mı?” String sınıfının final olarak işaretlenmesinin ana nedenlerinden biri budur. Hiç kimse String yöntemlerinin herhangi birinin davranışlarını geçersiz kılamaz, bu nedenle güvendiğiniz String nesnelerinin olduğundan emin olabilirsiniz.
değişmez olmak aslında değişmez olacaktır. :)
String Sınıfları Nasıl Oluşturulur?
String s = “abc”;
String s = new String(“abc”);
String sınıflarını birkaç yöntemle yapabiliriz.Bunlara örnek verelim.
String Sınıfının önemli methodları hangileridir?
■ charAt() : sıra numarası girilen karakteri döner.
■ concat() : ilk string’in sonuna ikinci string değerini ekler.(+ gibi çalışır.)
■ equalsIgnoreCase() :Büyük küçük harf dikkate alınmadan iki string eşit mi kontrol eder.
■ length() :String’in toplam krakter sayısını döner
■ replace() :bir krakteri diğer bir krakter ile değiştirir.
■ substring() : baslangıç ve bitişi girilen bir bölüm krakteri döner
■ toLowerCase() : tüm stringi küçük harfe çevirerek döner.
■ toString() string tipinde döner(sayıları,rakamların tipini string olarak döner)
■ toUpperCase() tümünü büyük harfe çevirerek döner
■ trim() boşlukları silerek stringi döner.
Metotlara örnek vererek detaylandıralım.
public char charAt(int index)
String x = “airplane”;
System.out.println( x.charAt(2) );
output is ‘r’
public String concat(String s)
String x = “taxi”;
System.out.println( x.concat(“ cab”) ); // output is “taxi cab”
The overloaded + and += operators perform functions similar to the concat()
method — for example,
String x = “library”;
System.out.println( x + “ card”);
String x = “Atlantic”;
x+= “ ocean”;
System.out.println( x );
// output is “library card”
// output is “Atlantic ocean”
public boolean equalsIgnoreCase(String s)
String x = “Exit”;
System.out.println( x.equalsIgnoreCase(“EXIT”));
System.out.println( x.equalsIgnoreCase(“tixe”));
// is “true”
// is “false”
public int length()
String x = “01234567”;
System.out.println( x.length() ); // returns “8”
public String replace(char old, char new)
String x = “oxoxoxox”;
System.out.println( x.replace(‘x’, ‘X’) );
// output is
// “oXoXoXoX”
public String substring(int begin)
public String substring(int begin, int end)
String x = “0123456789”;// as if by magic, the value
// of each char
// is the same as its index!
System.out.println( x.substring(5) );
// output is “56789”
System.out.println( x.substring(5, 8));
// output is “567”
public String toLowerCase()
String x = “A New Moon”;
System.out.println( x.toLowerCase() );// output is // “a new moon”
public String toString()
String x = “big surprise”;
System.out.println( x.toString() );// output — // reader’s exercise
public String toUpperCase()
String x = “A New Moon”;
System.out.println( x.toUpperCase() );
// output is
// “A NEW MOON”
public String trim()
String x = “hi”;
System.out.println( x + “x” );
System.out.println( x.trim() + “x”);
// result is // “hix” // result is “hix”
StringBuffer and StringBuilder Sınıflarından Bahsedelim.
Stringlerde çok fazla değişiklik yapmanız gerektiğinde java.lang.StringBuffer ve java.lang.StringBuilder sınıfları kullanılmalıdır.
Önceki bölümde söylediğimiz gibi, String nesneleri değişmezdir, bu nedenle String nesneleri ile çok fazla manipülasyon yapmayı seçerseniz, String havuzunda çok sayıda terk edilmiş String nesnesi elde edersiniz. (Gigabaytlarca RAM’in olduğu bu günlerde bile, atılan String havuzu nesnelerinde değerli belleği boşa harcamak iyi bir fikir değildir.)
Bunun yerine kullanılan StringBuffer ve StringBuilder türündeki nesneler, büyük miktarda atılmış String nesnesi kalıntısı bırakmadan tekrar tekrar değiştirilebilir.
İki Sınıf Arasındaki Fark StringBuilder class’ı StringBuffer’ın performans sorunlarını gidermek için Java 5'te eklenmiştir. İki class için de API aynıdır. StringBuilder’ın farkı StringBuffer’ın aksine senkronize olmamasıdır. (non-synchronized)
StringBuilder ve StringBuffer Yazımı
String x = “abc”;
x.concat(“def”);
System.out.println(“x = “ + x); //output is “x = abc”
String x = “abc”;
x = x.concat(“def”);
System.out.println(“x = “ + x); // output is “x = abcdef”
StringBuffer sb = new StringBuffer(“abc”);
sb.append(“def”);
System.out.println(“sb = “ + sb); // output is “sb = abcdef”
StringBuilder sb = new StringBuilder(“abc”);
sb.append(“def”).reverse().insert(3, “ — -”);
System.out.println( sb );// output is “fed — -cba”
StringBuffer and StringBuilder Sınıfının Önemli Metotları
public synchronized StringBuffer append(String s)
StringBuffer sb = new StringBuffer(“set
sb.append(“point”);
System.out.println(sb); // output is “set point”
StringBuffer sb2 = new StringBuffer(“pi = “);
sb2.append(3.14159f);
System.out.println(sb2); // output is “pi = 3.14159”
public StringBuilder delete(int start, int end)
StringBuilder sb = new StringBuilder(“0123456789”);
System.out.println(sb.delete(4,6));// output is “01236789”
public StringBuilder insert(int offset, String s)
StringBuilder sb = new StringBuilder(“01234567”);
sb.insert(4, “ — -”);
System.out.println( sb );//output is “0123 — -4567”
public synchronized StringBuffer reverse()
StringBuffer s = new StringBuffer(“A man a plan a canal Panama”);
sb.reverse();
System.out.println(sb); // output: “amanaP lanac a nalp a nam A”
public String toString()
StringBuffer sb = new StringBuffer(“test string”);
System.out.println( sb.toString() ); // output is “test string”
Bu yazımızda String,String Builder ve String Buffer sınıflarını inceledik. iyi çalışmalar.