Bu yazıda Java dilinde dizi kavramını ele alacağız ve temel kavramları öğreneceğiz. Diziler (array), aynı türdeki değerlerin bir arada tutulmasını sağlayan ve sabit büyüklüğe sahip nesnelerdir. Bunu açacak olursak:
- Bir dizi aynı türden nesneleri tutmak zorundadır. Burada tür,
int
,boolean
gibi temel (primitive) türler olabileceği gibi nesne referansları da olabilir. - Dizi yaratıldıktan sonra boyutu değişmez. Sabittir, ne uzar ne kısalır.
Dizi Tanımlama
Diyelim ki 10 öğrencili bir sınıfa sınav yaptınız ve verdiğiniz notları bir dizide tutmak istiyorsunuz. Notları tamsayı cinsinden verdiğinizi düşünürsek, 10 elemanlı bir int
dizisi işinizi görecektir.
int[] notlar;
Yukarıdaki satır notlar
isminde int
türünden bir dizi referansını tanımlamaktadır. Normal bir int
değişkeninden tek farkı diziyi temsil eden köşeli parantezdir. Ancak ortada henüz bir dizi yok, sadece referansı tanımladık. Diziler nesne olduklarından new
anahtar kelimesi ile yaratılırlar.
int[] notlar = new int[10];
Yukarıdaki satır ise eşitliğin sağ tarafında 10 elemanlı bir int
dizisi yaratmakta ve notlar
isimli dizi referansına atama yapmaktadır. Diziler sabit büyüklükte oldukları için, yaratırken kaç elemanlı olduğu bilgisini vermemiz gerekmektedir. Eğer aşağıdaki gibi boyut belirtmeden bir tanımlama yaparsanız derleyici hata verecektir:
int[] notlar = new int[]; // derleme hatası, boyut belirtilmemiş
Java’da herhangi bir türden dizi yaratmak mümkündür. Aşağıdaki örnekleri inceleyebilirsiniz:
String[] stringDizisi = new String[4];
boolean[] booleanDizisi = new boolean[100];
Ogrenci[] ogrenciDizisi = new Ogrenci[10];
Dizi Elemanlarının İlk Değerleri
Peki böyle bir dizi yarattığımızda içindeki elemanların değerleri ne olacaktır? Temel (primitive) bir tür olan int
kullandığımız için ilk değerler 0
olacaktır. Diğer temel türler için de bu durum geçerlidir. Örneğin boolean
türünde bir dizi tanımlarsanız ilk değerler false
, double
türünde tanımlarsanız 0.0
olacaktır. Nesne türleri kullanıyorsanız bütün ilk değerler null
olacaktır.
Dizi Elemanlarına Erişim
Şimdi bu dizinin elemanlarına nasıl atama yapıyoruz ona bakalım.
notlar[0] = 61;
notlar[1] = 94;
notlar[2] = 35;
notlar[3] = 80;
notlar[4] = 76;
notlar[5] = 54;
notlar[6] = 67;
notlar[7] = 79;
notlar[8] = 92;
notlar[9] = 46;
Yukarıda 10 elemanlı dizinin her elemanına bir atama yaptık. Dizinin kaçıncı elemanına atama yaptığımızı köşeli parantez içinde belirtiyoruz. Buna indis (index) denmektedir. Dikkat ederseniz indis değeri 1 değil 0’dan başlamaktadır. Yani dizinin ilk elemanını 0 indisi ile temsil ediyoruz.
Dizi elemanlarına erişmek istersek de aynı yöntemi kullanıyoruz:
int not = notlar[0];
Burada int
türündeki not
değişkeni dizinin 0. indisteki elemanı olan 61 değerini alacaktır.
Dizilerin Uzunluğu
Daha önce belirttiğim gibi diziler yaratıldıktan sonra boyutları değiştirilemez, ancak bir dizinin uzunluğunu kontrol edebiliriz:
String[] array = new String[5];
int arrayLength = array.length;
Her dizi değişkeninin uzunluğu tutan bir length
alanı vardır. Yukarıdaki örnekte arrayLength
değişkeni 5 değerine sahip olacaktır.
Dizi Elemanlarını Tarama
Aşağıdaki gibi bir for
döngüsü kullanarak dizinin tüm elemanlarını tarayabiliriz:
int[] intArray = new int[10];
for(int i=0; i < intArray.length; i++) {
intArray[i] = i * 2;
}
for(int i=0; i < intArray.length; i++) {
System.out.println( intArray[i] );
}
Burada önce 10 elemanlı bir int
dizisi tanımladık. Sonra for
döngüsü içinde indisi temsil eden ve ilk değeri 0 olan i
değişkenini tanımladık. Her döngüde dizi elemanına indis değerini ikiyle çarpıp değer ataması yaptık. İkinci for
döngüsünde ise yine indis değişkenini kullanarak bütün elemanları sırayla ekrana yazdırdık.
Dizi elemanlarını taramak için kullanabileceğimiz diğer bir yöntem ise for-each
döngüsüdür.
for(int value : intArray) {
System.out.println( value );
}
Bu döngü kodu daha temiz ve anlaşılır. Ancak iki dezavantajı var:
- Elemanları sadece okumaya izin verir, yazma yapamayız.
- Elemanların indis bilgisini göremeyiz.
Bunlar sizin için gerekli değilse for-each
döngüsü kullanmak daha iyi olacaktır. Yukarıdaki örnekte elemanların değerlerini indislerinden bağımsız olarak okuyup ekrana yazdırdığımız için for-each
döngüsü daha mantıklıdır.
Tek Satırda Dizi Tanımlama ve Atama Yapma
Bir diziyi tanımlarken elemanların değerini de biliyorsanız, tanımlama ve atamayı tek satırda yapabilirsiniz. Örneğin, yazının başında gördüğümüz ve not değerlerini tutan int
dizisini bu şekilde tanımlayalım:
int[] notlar = { 61, 94, 35, 80, 76, 54, 67, 79, 92, 46 };
Gördüğünüz gibi tanımlama ve değer atamalarını tek satırda hallettik. new
anahtar kelimesine ve dizi boyutunu belirtmemize gerek kalmadı çünkü eleman sayısı zaten yaptığımız atamalardan belli oluyor. String
türünden bir dizimiz olsaydı aşağıdaki gibi yazabilirdik:
String[] strings = {"monday", "tuesday", "wednesday"};
ArrayOutOfBoundsException
Dizilerin boyutlarının sabit olduğunu artık biliyoruz. Dizi elamanlarına erişirken indis değerinde bir hata yaparsanız ArrayOutOfBoundsException
hatası ile karşılaşırsınız.
int[] intArray = new int[]{ 1, 2, 3 };
System.out.println(intArray[3]);
Yukarıdaki örnekte 3 elemanları bir dizimiz var ve 3. indisteki elemanı okumaya çalışıyoruz. Bu yanlıştır çünkü 3 elemanlı bir dizinin indis değerleri 0, 1 veya 2 olabilir. Dizi sınırlarının dışına çıktığımız için aşağıdaki gibi bir hata alırız:
Index 3 out of bounds for length 3
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
Daha sonraki yazılarda dizilerle ilgili daha ileri konuları inceleyeceğiz.