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
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.