# Java'da Diziler ## Java'da Dizi (Array) DeÄiÅkenler hafızada tek bir deÄer tutmamızı saÄlar. Fakat bazı durumlarda, birden çok veriyi bir arada bulundurmak isteriz. ÃrneÄin, bir sınıfta okuyan 20 öÄrenci olsun. Bu 20 öÄrenci için hafızada ayrı ayrı 20 tane deÄiÅken oluÅturmak yerine, tek bir deÄiÅken kullanarak 20 öÄrencinin koleksiyonunu tutmak isteyebiliriz. Bu gibi durumlarda dizileri kullanırız. Dizi, aynı türden birden fazla deÄiÅkeni tutmamızı saÄlayan hafıza birimidir. Kısaca, dizileri aynı türden elemanları gruplamak için kullanırız. Dizi oluÅturduktan sonra dizinin içerisindeki elemanlara indeks numarasıyla ulaÅır ve deÄiÅtiririz. Ayrıca, çok boyutlu diziler oluÅturmak da mümkündür. Tek boyutlu dizi kullanabileceÄimiz gibi 2 veya 3 boyutlu diziler de oluÅturabiliriz. 2 boyutlu dizilere matris denir. Dizi (Array) kavramı programlama dillerinde bir veri tipini ifade eder. Bu veri tipi liste halindeki ardıÅık verileri bir arada tutan yapıya denilir. Bu ardıÅık yapıya ait elemanlara indeks yoluyla eriÅim saÄlanabilir. Diziler sabit boyutludur. ÃrneÄin: 10 elemanlık dizi. Dizilerde aynı tipten veri tutulur. ÃrneÄin: tüm elemanları "int" olan bir dizi. Dizi'nin hafızada bir baÅlangıç adresi olur ve ardıÅık olan diÄer elemanlar sırayla hafızaya yerleÅtirilir. Dizi'ler "new" anahtar sözcüÄüyle oluÅturulur. Böylece, Heap Hafıza bölgesinde yer kaplarlar. ````java double[] myList; // tercih edilen yol veya double myList[]; // baÅka türlü tanımlama biçimi ```` Diziler veri tipi ve [] parantezler ile belirtilir. Yukarıda iki farklı tanımı görülmektedir. Hafızadan yer alıp diziye alan ayırabilmek için "new" anahtar kelimesi kullanılır. ````java double[] myList = new double[10]; ```` Yukarıda maksimum 10 eleman alabilen "double" veri tipinde olan bir dizi oluÅturulmuÅtur.  Yukarıda "myList" isminde bir dizi tanımlamıÅtık. Tanımlanan dizi hafıza yukarıdaki Åekildeki gibi tutulur. "myList" deÄiÅkeni dizinin baÅlangıç adresini tutar. Dizilerde ardıÅık bir sıra olduÄu için ilk elemandan sonra gelen elemanların hafıza adresleri de birer birer artar. Dizi blok halinde yer kaplar. Diziye eriÅmek için indeks numarası kullanılır. ÃrneÄin: "myList[0]" demek dizinin 1. Elemanını verecektir. Java'da dizilerin indeksleri sıfırdan baÅlar. ÃrneÄin: "myList[5]", yani 5 nolu indeksteki dizi elemanını ver dediÄimizde aslında dizinin 6. Elemanına eriÅmiÅ oluruz. Ãrnekler: ````java // Java'da diziye ilk deÄerler süslü parantezler arasında verilir. double[] myList = { 1.9, 2.9, 3.4, 3.5 }; // tüm dizi elemanlarını arada boÅuk bırakarak sırayla ekrana yazdırır. for (int i = 0; i < myList.length; i++) { System.out.println(myList[i] + " "); } ```` Yukarıdaki örnekte myList isimli diziye ilk deÄerleri hemen verilmiÅtir. Süslü parantezler arasında kalan deÄerler dizi elemanlarıdır. Ardından, bir "for" döngüsü ile dizi elemanları ekrana yazdırılır. ### Dizileri Fonksiyonlara Parametre Olarak Göndermek TanımladıÄınız dizileri fonksiyonlara parametre olarak gönderebilirsiniz. ÃrneÄin elimizde static bir fonksiyon olsun. Bu fonksiyona int tipinde verileri olan bir diziyi girdi (input) olarak vermek istersek aÅaÄıdaki gibi olur. ````java public static void printArray(int[] array) { for (int i = 0; i < array.length; i++) { System.out.print(array[i] + " "); } } ```` printArray ( int[] array ) kırmızı olarak iÅaretlediÄimiz yer diziyi yerel deÄiÅken olarak fonksiyona gönderdiÄimiz noktadır. Java'da tüm deÄiÅkenler "Pass by Value" yöntemiyle geçilir. Bu Åu demektir. Sizin tanımladıÄınız deÄiÅkenin, nesnenin veya dizinin birebir kopyası oluÅturulur. Bu kopya deÄer fonksiyona yerel deÄiÅken olarak gider. Bu Java mülakatlarında size sorulabilecek bir detaydır. ### Dizileri Fonksiyonlardan Geri Döndürmek Fonksiyonlar belli bir iÅi yapıp sonucunda deÄer dönebilen veya dönmeyen kod bloklarıdır. Fonksiyonlar için altın kural, her fonksiyonun tek bir iÅi olmalıdır. ÃrneÄin: dizi ortalaması alma iÅi yapan bir fonksiyon dizileri ekrana yazdırma iÅini yapmamalıdır. Veya dizilerin ortalamasını alma iÅi ile dizileri toplama iÅlemi aynı fonksiyon içinde olmamalıdır. Her biri ayrı fonksiyonlar olmalıdır. ````java public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; } return result; } ```` Yukarıda dizinin tersine çevrilmiÅ halini döndüren bir fonksiyon vardır. public static **int[]** reverse(â¦) koyu renkle iÅaretlenen alan dizi döndüreceÄimizi ve bu dizinin veri tipini söylüyoruz. Burada veri tipimiz "int". ## Tek Boyutlu Diziler Tek boyutlu diziler basitçe, aynı türden elemanların listesini tutan bir yapıdır. Dizi oluÅturmak için, önce dizide yer alacak elemanların türü belirtilir, sonra diziye bir isim verilir ve isimden sonra köÅeli parantezler ( [ ve ] ) konulur. ```java int numbers[]; // Burada numbers isminde bir dizi oluÅturuluyor ``` KöÅeli parantezleri deÄiÅken isminden sonra koymak yerine, tür isminden sonra da yazabilirsiniz. ÃrneÄin aÅaÄıdaki kodun yukarıdakiyle bir farkı yoktur: ```java int[] numbers; // Burada numbers isminde bir dizi oluÅturuluyor ``` Diziler new deyimiyle oluÅturulur. Dizi oluÅtururken kapasite deÄeri vermek **zorunludur**. Kapasite deÄeri, dizinin kaç eleman barındıracaÄını belirtir. AÅaÄıdaki örnekte, 5 adet int deÄiÅkeni tutabilecek bir dizi oluÅturuluyor: ```java int[] numbers = new int[5]; ``` Bu ifade çalıÅtırıldıÄında, hafızada 5 adet int deÄiÅken için yetecek kadar alan ayrılır. Bu alanı düzenleyebilmek için indeks numaraları kullanırız. **Dizi indeksleri 0âdan baÅlar** ve kapasitenin 1 eksiÄine kadar gider. ÃrneÄin, yukarıdaki dizinin indeksleri 0âdan 4âe kadardır. Åimdi bu dizinin ilk elemanını verelim: ```java numbers[0] = 10; // Dizinin ilk elemanı 5 olarak ayarlandı. ``` Dizinin diÄer elemanlarını Åu Åekilde verelim: ```java numbers[1] = 15; numbers[2] = 20; numbers[3] = 25; numbers[4] = 30; ``` Bu kodlar çalıÅtırıldıÄında dizinin elemanları sırasıyla aÅaÄıdaki gibi olur: { 10, 15, 20, 25, 30 } AÅaÄıdaki kodu çalıÅtırdıÄınızda konsola 25 yazar: ```java System.out.println(numbers[3]); ``` Dizilerle uÄraÅırken indeks numaralarına çok dikkat etmelisiniz. EÄer dizinin aralıÄı dıÅında bir indekse eriÅmeye çalıÅırsanız, **_IndexOutOfBoundsException_** hatası meydana gelir. ```java System.out.println(numbers[5]); // Hata! ``` Yukarıdaki satır hataya neden olur; çünkü numbers dizisinin kapasitesi 5 olmasına raÄmen dizinin 6. elemanına eriÅmeye çalıÅıyoruz. EÄer dizinin içindeki elemanlar dizi oluÅturulurken belliyse, diziyi oluÅtururken elemanları küme parantezi içinde ve virgülle birbirinden ayırarak verebiliriz: ```java String[] weekDays = new String[] { "Pazartesi", "Salı", "ÃarÅamba", "PerÅembe", "Cuma", "Cumartesi", "Pazar" }; ``` Bu Åekilde oluÅturulan dizilere kapasite vermemize gerek yoktur; çünkü kapasite deÄeri zaten eleman sayısından bellidir. Yukarıdaki örnekde **_weekDays_** dizisinin kapasitesi otomatik olarak 7 olur. Yukarıdaki gibi dizi oluÅtururken new deyimini kullanmaya gerek yoktur. Yani, yukarıdaki kodu aÅaÄıdaki gibi yazabiliriz: ```java String[] weekDays = { "Pazartesi", "Salı", "ÃarÅamba", "PerÅembe", "Cuma", "Cumartesi", "Pazar" }; ``` ### Dizinin Kapasitesini ÃÄrenmek Her dizinin **length** adında bir özelliÄi bulunur. Bu özelliÄi kullanarak dizinin kapasitesini öÄrenebilirsiniz. ÃrneÄin, aÅaÄıdaki kodu inceleyelim: ```java int[] numbers = new int[100]; System.out.println(numbers.length); // Konsolda 100 yazar ``` ### Dizinin Bir Elemanını DeÄiÅtirme ```java String[] cars = {"Volvo", "BMW", "Ford", "Mazda"}; cars[0] = "Opel"; cars[2] = "Toyota"; System.out.println(cars[0]); ``` ### Dizi İçinde Foreach Döngüsü İle Gezinme Dizi içinde aÅaÄıdaki gibi bir notasyonla dolaÅılıp iÅlem yapılabilir. ```java int countPositive=0; int[] numbers={-5,3,4,-2,6,-8,7}; for(int number:numbers){ if(number>0){ countPositive++; } } System.out.printLn("Positive item count of array:"+countPositive) ```