String sınıfı

Daha önce karşılaştığımız String sınıfını çok kullanacağız. Onun için onu daha yakından tanımalıyız. String sınıfı, procedural dillerde karakter dizilerinin ( char array) yerine geçer, demiştik. Ama ondan fazlasını yapar. Çünkü String bir ilkel veri tipi değil, bir sınıftır. Kendi değişkenleri ve kendi metotları vardır. Dolayısıyla, ondan değişik nesneler türetilir ve o nesnelerle farklı işlemler yapılabilir. Aşağıdaki Str01 ile Str02 programları aynı işi yaparlar, ama ikincisi String sınıfını kullanarak yapar.

class Str01 {

   public static void main(String[] args){

          System.out.print("Ankara Türkiye\’nin başkentidir.");

          System.out.println("İstanbul ise en büyük kentidir.");

   }

}

 

class Str02 {

   public static void main(String[] args){

          String txt1 = new String("Ankara Türkiye\’nin başkentidir.");

          String text2 = txt1.concat("İstanbul ise en büyük kentidir.");

          System.out.println(text2);

   }

}

Her iki programın çıktısı şudur:

Ankara Türkiye’nin başkentidir. İstanbul ise en büyük kentidir.

İkinci program daha karmaşık görünüyor. Ama birinciye göre daha hünerli bir alet kullanıyor. Bu aletin açıklamasını yapabilmek için, String sınıfını bilmeliyiz. String sınıfı java.lang paketi içindedir. Hiyerarşik yapısı şöyledir:

java.lang.Object
  extended by java.lang.String 

Sınıfın tanımı şöyledir:

public final class String extends Object

String sınıfının 10 dan fazla constructoru, 60 dan fazla metodu vardır. Dolayısıyla, bir programcının string işlemleriyle ilgili olarak karşılaşabileceği her işin yapılabilmesi mümkündür. Burada, örnek olarak birkaç constructoru ve metodu ele alacağız.

Str02 programının (sınıfının) üçüncü satırı String sınıfı için bir nesne yaratır. Bu kurucunun (constructor) işlevini yaptığı satırdır. Bu nesnenin adı txt1 dir. Bunu yapan kurucunun (constructor) sözdizimi şöyledir:

String txt1 = new String("Ankara Türkiye\’nin başkentidir.")

txt1, kurucunun yarattığı nesnenin bellekteki adresini işaret eden referans (pointer) dir. Onun işaret ettiği adreste

Ankara Türkiye\’nin başkentidir.”

metni yazılıdır. Burada önemle belirtelim ki, txt1 metni içermez, metnin bulunduğu bellek adresini işaret eder.(referans). Dördüncü satır bu metni ekrana yazar. Bunu nasıl yazdığını Str01 programından biliyoruz. Dördüncü satır, String sınıfının bir metodu olan

public String concat(String str)

metodunu kullanarak txt1 metni ile concat metodunun parametresi olan

"İstanbul ise en büyük kentidir.”

metnini birleştirir. Beşinci satır, birleşmiş metni, yani

Ankara Türkiye\’nin başkentidir.İstanbul ise en büyük kentidir.”

metnini ekrana yazar.

Java’da string (metin), Pascal ve C gibi dillerdeki anlamından çok farklıdır. O dillerde, string bir karakter dizimi (char array) olarak tanımlanır. Java’da ise, her metin String sınıfına ait bir nesnedir ve ana bellekte kendisine özgü bir yer ayrılmıştır. İki nesne aynı adreste bulunamayacağı için, iki string (içerikleri aynı olsa bile) birbirlerinden farklı nesnelerdir. .

System.out.print("Ankara Türkiye\’nin başkentidir.");

deyiminde “ “ parantezi içindeki metin sabit bir metindir ve String sınıfına ait bir nesnedir. Java’ bu türden sabit metinlerle, diğer dillerdeki karakter arrayleri ile yapılabilen işleri yapabiliriz. Ama biz daha fazlasını istiyoruz.

Öncelikle bir ayrıntıyı belirtmeliyiz. Yukarıdaki gibi sabit bir metin yaratıldığında, onu değiştiremeyiz. Ama bu string işlemlerini kısıtlayıcı bir olgu değil, tersine yararlı bir olgudur. İki nedenle böyledir:

·   Yaratılan sabit metni değiştirmek istiyorsak, istediğimiz değişikliğe uygun yeni bir metni her an yaratabiliriz.

·   StringBuffer kullanarak, ana bellekte metin üzerinde her türlü string işlemlerini gerçekleştirebiliriz.

Bir sabit string yaratmak kolaydır. Buun için, JProg02 de yaptığımız gibi, String sınıfına ait bir nesne (object) yaratmalıyız:

String metin1 = “Bu gün okula gittim.” ;

Eşitliğin sağ yanındaki tümce String sınıfına ait bir nesnedir. Ana bellekte ona bir yer ayrılmıştır. Metin1 referans değişkeni, ana bellekteki bu adresi gösteren bir işaretçi (pointer) dir.

Birleştirme Operatörü:

Java, iki metni birleştirmek için iki alete sahiptir:

1.       + operatörü

2.       concat() metodu

 

Örnek 1: Aşağıdaki örnek String sınıfına ait olan sabit bir nesne yaratmaktadır. Buradaki  (+) operatörü aşılmış (overload) bir operatördür. Saylardaki toplama işlemi anlamını aşarak, iki metni birleştirme (concetanation) işlevini üstlenmiştir.

class Str01 {

  public static void main(String args[]) {

 

       System.out.println("Bugün " + "okula gittim. "

                                  + "Java dersini dinledim." );

  }

}

 

Örnek 2: Aşağıdaki örnekte 3-5 inci satırlar, sırasıyla,  strOb1, strOb2, strOb3 referans değişkenlerinin işaret ettiği ve String sınıfına ait olan üç nesne yaratmaktadır. 6-ıncı satır, referans değişkenlerini kullanarak, metinleri standart çıkış birimine (burada monitör) yazmaktadır.

class Str02 {

  public static void main(String args[]) {

       String strOb1 = "Bugün ";

       String strOb2 = "okula gittim. ";

       String strOb3 = "Java dersini dinledim. ";

 

       System.out.println(strOb1 + strOb2 + strOb3);

      

  }

}

 

Örnek 3: Aşağıdaki örnekte 3-10-uncu satırlar, sırasıyla,  strOb1, strOb2, strOb3, strOb4, strOb5, strOb6, strOb7, strOb8 referans değişkenlerinin işaret ettiği ve String sınıfına ait olan sekiz nesne yaratmaktadır.

class Str03 {

  public static void main(String args[]) {

       String strOb1 = "Bugün ";

       String strOb2 = "okula gittim. ";

       String strOb3 = "Java dersini dinledim. ";

 

       String strOb4 = "Bugün "  +  "okula gittim. ";

       String strOb5 = strOb1 + strOb2;

 

       String strOb6 = strOb1 + strOb2  + strOb3;           

       String strOb7 = strOb4 + strOb3;

       String strOb8 = strOb5 + strOb3;

 

       System.out.println("strOb1= " + strOb1);

       System.out.println("strOb2= " + strOb2);

       System.out.println("strOb3= " + strOb3);

       System.out.println("strOb4= " + strOb4);

       System.out.println("strOb5= " + strOb5);

       System.out.println();

       System.out.println("strOb6= " + strOb6);

       System.out.println("strOb7= " + strOb7);

       System.out.println("strOb8= " + strOb8);

  }

}

 

Bu programın çıktısı şöyledir:

strOb1= Bugün

strOb2= okula gittim.

strOb3= Java dersini dinledim.

strOb4= Bugün okula gittim.

strOb5= Bugün okula gittim.

 

strOb6= Bugün okula gittim. Java dersini dinledim.

strOb7= Bugün okula gittim. Java dersini dinledim.

strOb8= Bugün okula gittim. Java dersini dinledim.

Görüldüğü gibi,  strOb6, strOb7, strOb8 referanslarının gösterdikleri nesneler içindeki metinler aynıdır. Son üç println() çıktısı, Str01 programının çıktısı ile aynıdır.

 

Örnek 4: Aşağıdaki örnek strOb6, strOb7, strOb8 referans değişkenlerinin işaret ettiği ve String sınıfına ait olan üç nesnenin içeriklerinin aynı olmakla birlikte, nesnelerin birbirlerinden farklı olduğunu göstermektedir.

class Str04 {

  public static void main(String args[]) {

       String strOb1 = "Bugün ";

       String strOb2 = "okula gittim. ";

       String strOb3 = "Java dersini dinledim. ";

 

       String strOb4 = "Bugün "  +  "okula gittim. ";

       String strOb5 = strOb1 + strOb2;

 

       String strOb6 = strOb1 + strOb2  + strOb3;           

       String strOb7 = strOb4 + strOb3;

              String strOb8 = strOb5 + strOb3;

 

       System.out.println(strOb6.equals(strOb7));

              System.out.println(strOb6 == strOb7);

 

       System.out.println(strOb6.equals(strOb8));

       System.out.println(strOb6 == strOb8);

 

              System.out.println(strOb7.equals(strOb8));

              System.out.println(strOb7 == strOb7);  

  }

}

 

Bu programın çıktısı aşağıdadır. Çıktıdan görüleceği gibi, 6,7,8-inci nesnelerin içerikleri aynıdır, ama kendileri (adresleri) birbirlerinden farklıdır. Java, her string için bir nesne yaratır.

 

true

false

true

false

true

false

Yukarıdaki programdan anlaşılacağı gibi, iki metnin eşit olup olmadığını görmek için equals() metodu kullanılır. Bu metot boolean değerlidir. Metinler eşitse true, değilse false çıkar. Örneğin, strOb6 ve strOb7 referanslarının işaret ettikleri nesnelerin içindeki metinlerin aynı olup olmadığını görmek için  strOb6.equals(strOb7)  deyimi kullanılır.

Nesnelerin eşit olması demek, bellekteki adreslerinin aynı (çakışık) olması demektir. İki nesnenin eşit olup olmadığını görmek için  ==  bağlantı operatörü kullanılır.  Bu metot da boolean değerlidir. Nesneler eşitse true, değilse false çıkar. Örneğin, strOb6 ve strOb7 referanslarının işaret ettikleri nesnelerin aynı olup olmadığını görmek için  strOb6 == strOb7  deyimi kullanılır. Bunlar ana bellekte farklı yerlerde bulundukları için, sonuç false çıkmıştır.

Örnek 5: Aşağıdaki örnekte 3-9 inci satırlar, sırasıyla,  strOb1, strOb2, strOb3, strOb4, strOb5, strOb6, strOb7, strOb8 referans değişkenlerinin işaret ettiği ve String sınıfına ait olan yedi nesne yaratmaktadır.

class Str05 {

    public static void main(String args[]) {

        String ob1 = "Bugün okula gittim. Java dersini dinledim.";

        String ob2 ;

 

        ob2 = ob1;

 

  System.out.println("ob1= " + ob1);

  System.out.println("ob2= " + ob2);

  System.out.println();

  System.out.println(ob1.equals(ob2));

  System.out.println(ob1 == ob2);

  }

}

 

Bu programın çıktısı aşağıdadır. 3-üncü satırda  ob1 referansı sabit bir stringi işaret etmektedir. 4-üncü satırda  String sınıfına ait bir nesneyi işaret etmek üzere ob2 nin bildirimi yapılmıştır, ama henüz hiçbir nesneyi işaret etmemektedir. 5-inci satırda ob2  ye, ob1 in işaret ettiği nesneyi işaret etmesi söylenmektedir. Dolayısıyla, ob1 ve ob2 referansaları aynı adresi işaret etmeye başlarlar. O nedenle, işaret edilen nesneler eşit olur. Tabii, nesnenin içeriği, her iki işaretçi için aynı olacaktır.

 

ob1= Bugün okula gittim. Java dersini dinledim.

ob2= Bugün okula gittim. Java dersini dinledim.

 

true

true

 

Örnek 6: Aşağıdaki örnek ob1 referansına sabit bir metin atadıktan sonra, ob2 referansına aynı adresi göstermektedir. Length metodu metnin uzunluğunu, charAt(n)  metodu n-inci karakterin ne olduğunu söyler.  !=  bağlantı operatörü, iki nesnenin farlı olup olmadığını denetler. ==  operatörünün olumsuzudur. Dolayısıyla, nesneler farklı ise true, eşitse false çıkar.

class Str06 {

    public static void main(String args[]) {

        String ob1 = "Bugün okula gittim. Java dersini dinledim.";

        String ob2 = ob1 ;

 

  System.out.println("ob1 'in uzunluğu      = " + ob1.length());

  System.out.println("ob2 'in 21-inci harfi = " + ob1.charAt(20));

  System.out.println();

  System.out.println(ob1.equals(ob2));

  System.out.println(ob1 != ob2);

  }

}

 

Programın çıktısı şudur:

 

ob1 'in uzunluğu      = 42

ob2 'in 21-inci harfi = J

 

true

false

Çıktıdan görüldüğü gibi,  metnin uzunluğu 42 karekterliktir. Metnin 20-inci harfi J dir. Sayma işlemi 0 dan başlar.  

 

String Dizimleri (String arrays)

Her veri tipinin dizimi (array) yapılabilir. Öyleyse öğeleri string (metin) olan dizimler yaratılabilir. Aşağıdaki örnek bunu göstermektedir.

Örnek 7: Aşağıdaki örnek ob1 referansına sabit bir metin atadıktan sonra, ob2 referansına

class Str07 {

  public static void main(String[] args){

        String str[] = {"Bugün ", "okula ", "gittim. ",

                                   "Java ", "dersini ", "dinledim."};

        for (int i = 0; i < str.length; i++)

        System.out.println(str[i]);

  }

}

Programın çıktısı aşağıdadır. Çıktıdan görüldüğü gibi, dizimin her öğesi bir stringdir.

str[0] = Bugün

str[1] = okula

str[2] = gittim.

str[3] = Java

str[4] = dersini

str[5] = dinledim.

 

Soru:

Str06 sınıfında ob1.length() yazıldığı halde Str07 sınıfında str.length yazılasının nedeni nedir?

 

 

Komut satırına string arrayi yazma (Command-Line Arguments)

 

Örnek 8:  Uygulama programlarında main(String args[]) metodunun daima var olması gerektiğini biliyoruz. main metodunun String dizimi tipinden args adlı bir parametresi vardır. İstenirse, java yorumlayıcısı bu parametreleri alır ve programın istediği biçimde kullanır. Aşağıdaki örnek bunu göstermektedir.

 

// Komut satırına metin dizimi yazma

class Str08 {

  public static void main(String args[]) {

    for(int i=0; i<args.length; i++)

      System.out.println("args[" + i + "]: " +

                          args[i]);

  }

}

 

Bu sınıfı derleyiniz. Sonra

      java DizimGir Bugün okua gittim. Java dersini dinledim.

komutunu giriniz. Programın çıktısı Str07 dekinin aynısı olacaktır:

F:\jders\string>java Str08 Bugun okula gittim. Java dersini dinledim.

args[0]: Bugun

args[1]: okula

args[2]: gittim.

args[3]: Java

args[4]: dersini

args[5]: dinledim.

 

 

Uyarı:

String sınıfı java’da çok önemli rol oynar. O nedenle, Java API ‘de tanımlı String sınıfının 10 dan fazla constructoru ve 100 den fazla metodu vardır. Bunların hepsini burada açıklamak gereksiz olur. Ama, yeri gelince, String sınıfının bütün constructorlarını ve metotlarını serbestçe kullanacağız. Öğrenci gerekli görürse, API’ye her an bakabilir.