diff --git a/array.md b/array.md new file mode 100644 index 0000000..715b61d --- /dev/null +++ b/array.md @@ -0,0 +1,119 @@ +# Dizilerin Genel Mantıkları + +- Java'da Diziler (Arrays) , her değer için ayrı değişkenler oluşturmak yerine, birden çok değeri tek bir değişkende depolamak için kullanılır. +- 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 indis yoluyla erişim sağlanabilir. Diziler sabit boyutludur ve tanımlanırken boyutları belirtilir. + +image + +- Yukarıdaki örnek 10 eleman boyutunda "Integer" veri tipi tutan bir dizidir. Dizilerdeki herhangi bir elemana ulaşmak için indis numaraları kullanılır. +- Dizi indisleri her zaman 0'dan başlar o yüzden dizinin son elemanının değeri, dizi boyutuna eşit değildir ve bu dikkat edilmesi gereken bir konudur. + +- Dizinin hafızada bir başlangıç adresi olur ve ardışık olan diğer elemanlar sırayla hafızaya yerleştirilir. Diziler "new" anahtar sözcüğüyle oluşturulur. Böylece, Heap Hafıza bölgesinde yer kaplarlar. + +- Dizinin genel formülü zihinde şöyle durabilir: +```java +“Tip + [] + isim = {elemanlar}” +``` +- Ya da elemanları sonra vereceksen: +```java +“Tip + [] + isim = new Tip[boyut]” +``` +- Daha sonra: +```java +“isim[index] = değer” +``` +```java +double[] myList; // tercih edilen yol +``` +veya +```java +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] + " "); + } +} +public static void main(String[] args) { + int[] list = {1,2,3,4}; + printArray(list); // ← kırmızı yer burası +} +``` +#### “Kırmızı” diye anlatılan kısım tam olarak: +```java +printArray(list); +``` +- Çünkü burada list dizisini fonksiyona gönderiyorsun. Java diyor ki: + +- “Ben sana bu dizinin referansının bir kopyasını veriyorum.” + +- Fiziksel dizinin kendisi kopyalanmaz; sadece diziyi gösteren adresin bir kopyası gider. İşte bunun adı “Pass by Value”. + +- Kısacası: + - Değişken = referans + - Fonksiyona giderken = referansın kopyası gider + - Ama iki taraf da aynı gerçek diziyi gösterir + +Bu yüzden fonksiyon diziyi değiştirirse, asıl dizin de değişmiş olur. + +- 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".