Arrays Yardımcı Sınıfı
Diziler (int[], String[]...) Java'nın en temel veri yapısıdır: sabit boyutlu, hızlı, bellek açısından kompakt. Ama dizilerin metotları yoktur — sıralamak, aramak, kopyalamak, karşılaştırmak için java.util.Arrays yardı…
Arrays Yardımcı Sınıfı
Diziler (int[], String[]...) Java'nın en temel veri yapısıdır: sabit boyutlu, hızlı, bellek
açısından kompakt. Ama dizilerin metotları yoktur — sıralamak, aramak, kopyalamak,
karşılaştırmak için java.util.Arrays yardımcı sınıfını kullanırsın. Bu konu, dizilerle günlük
çalışmayı kolaylaştıran bu metotları ve çok boyutlu dizi inceliklerini ele alır.
Tek boyutlu dizi işlemleri
Arrays.sort(dizi); // yerinde sırala Arrays.binarySearch(dizi, x); // SIRALI dizide hızlı ara (O(log n)) Arrays.copyOf(dizi, yeniBoyut); // kopya (boyut değiştirebilir) Arrays.copyOfRange(dizi, from, to); // dilim [from, to) Arrays.fill(dizi, deger); // tümünü doldur Arrays.equals(a, b); // İÇERİK karşılaştırması Arrays.toString(dizi); // okunaklı yazdırma Arrays.asList(dizi); // List görünümü Arrays.stream(dizi); // Stream'e çevir
Örnek 1 (./Ornek1.java) hepsini gösterir. İki kritik tuzak:
==vsArrays.equals: Diziler nesnedir;a == breferansları karşılaştırır (içerik aynı olsa bile false olabilir). İçerik içinArrays.equals(a, b)kullan.
toStringtuzağı:dizi.toString()çöp basar ([I@1b6d3586). Okunaklı çıktı içinArrays.toString(dizi)kullan.
asListsınırı:Arrays.asList, sabit boyutlu bir görünüm döndürür (add/removeatar). Değiştirilebilir liste içinnew ArrayList<>(Arrays.asList(...)).
Çok boyutlu diziler
Java'da çok boyutlu dizi aslında "dizilerin dizisidir": int[][], her elemanı bir int[]
olan bir dizidir. Bunun iki sonucu var:
- Satırlar farklı uzunlukta olabilir (jagged / düzensiz dizi).
- Yazdırma/karşılaştırma için derin (deep) sürümler gerekir:
Arrays.deepToString(matris); // iç içe dizileri doğru yazdırır Arrays.deepEquals(m1, m2); // içerik karşılaştırması (derin)
Örnek 2 (./Ornek2.java) bir matrisi gezer, deepToString/deepEquals'i ve düzensiz diziyi
gösterir. (Sıradan toString/equals çok boyutluda yanıltıcıdır — iç dizilerin adresine bakar.)
Dizi mi, koleksiyon mu?
Dizi (T[]) | ArrayList<T> | |
|---|---|---|
| Boyut | Sabit | Dinamik |
| İlkel tip | Destekler (int[]) | Hayır (kutulama) |
| API | Yok (Arrays yardımcı) | Zengin |
| Performans | En kompakt/hızlı | Çok yakın, esnek |
İlkel tiplerle yoğun sayısal iş veya sabit boyut için dizi; esneklik ve API için ArrayList
(topic 47).
Performans notu
Çok büyük dizilerde Arrays.parallelSort, birden çok çekirdek kullanarak sort'tan daha hızlı
sıralayabilir. Küçük dizilerde fark yoktur (hatta ek yük getirir).
Özet
Arrays sınıfının dizilerle çalışmayı kolaylaştıran metotlarını — sort/binarySearch/copyOf/
fill/equals/toString/asList/stream (Örnek 1) — ve == vs equals, toString tuzaklarını
öğrendik; çok boyutlu dizileri, deepToString/deepEquals ve düzensiz dizileri (Örnek 2) gördük.
Sırada, bit düzeyinde verimli bayrak yönetimi: BitSet.
▶ Kod Örnekleri(2)
Ornek1
çalıştırılabilir1// Ornek1: Arrays yardımcı sınıfı — sıralama, arama, kopyalama, karşılaştırma.
2// Çalıştırma: java Ornek1.java
3import java.util.Arrays;
4
5public class Ornek1 {
6
7 public static void main(String[] args) {
8 int[] sayilar = { 5, 2, 8, 1, 9, 3 };
9
10 // toString: diziyi okunaklı yazdır (dizilerin kendi toString'i işe yaramaz!)
11 System.out.println("Ham: " + Arrays.toString(sayilar));
12
13 // sort: yerinde sıralar
14 Arrays.sort(sayilar);
15 System.out.println("Sıralı: " + Arrays.toString(sayilar));
16
17 // binarySearch: SIRALI dizide hızlı arama (O(log n)) — dizinin sıralı olması ŞART
18 System.out.println("8'in indeksi: " + Arrays.binarySearch(sayilar, 8));
19
20 // copyOf / copyOfRange: kopya/dilim (boyut değiştirebilir)
21 int[] kopya = Arrays.copyOf(sayilar, 4); // ilk 4
22 int[] dilim = Arrays.copyOfRange(sayilar, 1, 4); // [1,4) aralığı
23 System.out.println("copyOf(4): " + Arrays.toString(kopya));
24 System.out.println("copyOfRange(1,4): " + Arrays.toString(dilim));
25
26 // fill: tümünü bir değerle doldur
27 int[] sifirlar = new int[5];
28 Arrays.fill(sifirlar, 7);
29 System.out.println("fill(7): " + Arrays.toString(sifirlar));
30
31 // equals: içerik karşılaştırması (== referans karşılaştırır, yanıltıcı!)
32 int[] a = {1, 2, 3}, b = {1, 2, 3};
33 System.out.println("a == b ? " + (a == b) + " | Arrays.equals(a,b) ? " + Arrays.equals(a, b));
34
35 // asList: diziyi List'e (sabit boyutlu görünüm); stream ile işleme
36 String[] kelimeler = { "elma", "armut", "kiraz" };
37 System.out.println("asList: " + Arrays.asList(kelimeler));
38 int toplam = Arrays.stream(sayilar).sum();
39 System.out.println("stream().sum(): " + toplam);
40
41 System.out.println("""
42
43 --- Arrays yardımcı sınıfı ---
44 Diziler ilkel/sabit boyutludur ve metotları yoktur; Arrays sınıfı yardımcıları sağlar.
45 sort (yerinde sırala), binarySearch (SIRALI dizide hızlı ara), copyOf/copyOfRange (kopya/dilim),
46 fill (doldur), equals (İÇERİK karşılaştır — '==' referansa bakar!), toString (yazdır),
47 asList (List görünümü), stream (akışa çevir). Çok boyutlu için deepToString/deepEquals (sonraki örnek).""");
48 }
49}Ornek2
çalıştırılabilir1// Ornek2: Çok boyutlu diziler ve deepToString/deepEquals.
2// Çalıştırma: java Ornek2.java
3import java.util.Arrays;
4
5public class Ornek2 {
6
7 public static void main(String[] args) {
8 // 2 boyutlu dizi (matris): satır x sütun
9 int[][] matris = {
10 { 1, 2, 3 },
11 { 4, 5, 6 },
12 { 7, 8, 9 }
13 };
14
15 // toString çok boyutluda işe YARAMAZ (iç dizilerin adresini basar); deepToString gerekir.
16 System.out.println("toString : " + Arrays.toString(matris)); // [[I@... çöp
17 System.out.println("deepToString: " + Arrays.deepToString(matris)); // içerik
18
19 // Erişim ve gezinme
20 System.out.println("\nmatris[1][2] = " + matris[1][2]);
21 long kosegen = 0;
22 for (int i = 0; i < matris.length; i++) kosegen += matris[i][i];
23 System.out.println("Köşegen toplamı: " + kosegen);
24
25 // Çok boyutlu karşılaştırma: deepEquals
26 int[][] m2 = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
27 System.out.println("\nequals : " + Arrays.equals(matris, m2)); // false (iç diziler farklı nesne)
28 System.out.println("deepEquals : " + Arrays.deepEquals(matris, m2)); // true (içerik aynı)
29
30 // Düzensiz (jagged) dizi: satırlar farklı uzunlukta olabilir
31 int[][] jagged = new int[3][];
32 jagged[0] = new int[]{ 1 };
33 jagged[1] = new int[]{ 1, 2 };
34 jagged[2] = new int[]{ 1, 2, 3 };
35 System.out.println("\nJagged: " + Arrays.deepToString(jagged));
36
37 System.out.println("""
38
39 --- Çok boyutlu diziler ---
40 Java'da çok boyutlu dizi = "dizilerin dizisi" (int[][] -> her eleman bir int[]).
41 Bu yüzden satırlar farklı uzunlukta olabilir (jagged/düzensiz dizi).
42 deepToString/deepEquals: iç içe dizileri DOĞRU yazdırır/karşılaştırır (toString/equals yetmez).
43 Büyük dizilerde Arrays.parallelSort çok çekirdekte daha hızlı sıralayabilir.""");
44 }
45}