Dizi, Sabit Boyutlu Bir Listedir
Java'daki bir dizi, aynı tipte sabit sayıda değeri sırayla tutar ve bunlara konumlarına göre erişilir. Anahtar kelime "sabit"tir: bir diziyi oluşturduğunuzda, uzunluğu asla değişmez. Ve "aynı tip": bir int[] yalnızca int değerleri tutar, bir String[] yalnızca dizgileri tutar. Bu katılık, dizilerin hızlı ve bellekte derli toplu olmasının bedelidir.
Bir dizi tipini, eleman tipinin ardına [] koyarak tanımlarsınız; ardından ya bir literal atarsınız ya da new ile bir tane ayırırsınız:
Köşeli parantezler tipin ardına (int[] scores) ya da ismin ardına (int scores[]) gelebilir. İkisi de derlenir, ama int[] scores Java'nın deyimsel stilidir - []'yi, ait olduğu yere, tipin yanına koyun.
new ile Dizi Oluşturma
Değerleri henüz bilmediğiniz ama boyutu bildiğiniz durumda new kullanın. Bu, hücreleri ayırır ve tipin varsayılan değeriyle doldurur:
Varsayılan değerler rastgele çöp değildir - Java her elemanı sıfırla başlatır. Sayısal tipler 0 (ya da 0.0) ile başlar, boolean false ile başlar ve String gibi referans tipleri null ile başlar. Bu null'ı aklınızda tutmaya değer: yeni ayrılmış bir String[] baştan sona null'larla doludur ve bunlardan birinde bir metot çağırmak NullPointerException fırlatır.
İndeksleme Sıfırdan Başlar
Elemanları, 0'dan saymaya başlayarak indekse göre okur ve yazarsınız. Son geçerli indeks her zaman length - 1'dir:
Bazı betik dillerindeki dizilerin aksine, aralığın dışına çıkmak size sessizce null ya da undefined vermez - istisna fırlatır. Var olmayan bir indeksi okumayı deneyin:
O program şununla çöker:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 3
Bu, yeni başlayanların en sık yaptığı hatalardan biridir. Çözüm neredeyse her zaman bir döngü koşulundaki bir-fazla (off-by-one) hatasıdır - < demek isterken <= kullanmak.
length Bir Metot Değil, Bir Alandır
Her dizi boyutunu bir length alanında taşır. Dikkat: parantez yok.
İşte herkesin en az bir kez yakalandığı bir tuzak: diziler .length (bir alan) kullanır, ama String .length() (bir metot) kullanır. Bir dizide nums.length() yazmak bir derleme hatasıdır; bir dizgide text.length yazmak da öyle. Aynı kelime, farklı kurallar - dizinin olanın parantezi yoktur.
Bir Dizide Döngü Kurma
For-each döngüsünü önceki sayfada öğrendiniz ve indekse ihtiyacınız olmadığında her elemanı okumanın en temiz yolu odur:
İndekse ihtiyacınız olduğunda - konum numaralarını yazdırmak, elemanları yerinde değiştirmek ya da geriye doğru ilerlemek için - sınır olarak length kullanan klasik indeksli for döngüsüne başvurun:
Koşul i < names.length'dir, <= değil. <= kullanmak bir adım fazla gider ve yukarıdaki bölümdeki aralık dışı istisnayı fırlatır. Hızlı bir kural: yalnızca değerleri okuyorsanız for-each, konuma ihtiyacınız varsa ya da diziye geri yazmak istiyorsanız indeksli for.
Çok Boyutlu Diziler
Bir 2B dizi aslında dizilerden oluşan bir dizidir - onu satır ve sütunlardan oluşan bir ızgara olarak düşünün. İkinci bir çift köşeli parantez eklersiniz:
grid[satır][sütun] tek bir hücreyi seçer. Her satır kendi başına bir dizi olduğu için, grid.length satır sayısıdır ve grid[0].length ilk satırdaki sütun sayısıdır. Satırların aynı uzunlukta olması bile gerekmez (buna pürüzlü dizi denir), gerçi çoğu ızgara dikdörtgendir.
Arrays Yardımcı Sınıfı
Dizilerin kendisinin neredeyse hiç metodu yoktur - bir diziyi doğrudan kullanışlı bir şekilde sıralayamaz ya da yazdıramazsınız. Java, tam da bunun için statik yardımcılarla dolu bir java.util.Arrays yardımcı sınıfı sağlar:
Burada güvenebileceğiniz birkaç şey var. Arrays.toString(arr), bir diziyi yazdırmanın doğru yoludur - doğrudan yazdırmak size [I@1b6d3586 gibi işe yaramaz bir dizgi verir. Arrays.sort yerinde sıralar. Arrays.copyOf, "yeniden boyutlandırma" yapma şeklinizdir: istediğiniz uzunlukta yeni bir dizi döndürür, varsayılan değerlerle doldurarak (yukarıdaki iki fazla hücre 0'dır). Ve Arrays.binarySearch yalnızca zaten sıralanmış bir dizide doğru çalışır.
Diziler ile ArrayList Karşılaştırması
Boyut önceden biliniyorsa ve değişmeyecekse düz bir dizi kullanın - haftanın günlerinin sabit kümesi, bir oyun tahtası, piksel verisi. Diziler hızlı ve hafiftir, ama sabit uzunlukları gerçek bir sınırlamadır: uzunluğu 6 olan bir diziye, tamamen yeni bir tane inşa etmeden yedinci bir eleman ekleyemezsiniz.
Öğeleri serbestçe ekleyip çıkarmaya başladığınız an, bir dizi hantal hale gelir. ArrayList tam da bunun içindir - kopyalama işini sizin yerinize halleden, yeniden boyutlanabilir, büyüyebilen bir liste.
Sırada: ArrayList
Kaç öğeniz olacağını bilmediğinizde ya da bu sayı programınız çalışırken değiştiğinde, sabit uzunluklu bir dizi ayak bağı olur. ArrayList, Java'nın cevabıdır: indekslerle uğraşmak yerine add ve remove metotlarıyla, talep üzerine büyüyüp küçülen bir liste. Sırada o var.
Sıkça Sorulan Sorular
Java'da bir dizi nasıl tanımlanır ve ilk değer atanır?
Tipi köşeli parantezlerle tanımlayın ve bir literal atayın: int[] nums = {1, 2, 3};. Sabit boyutlu boş bir dizi oluşturmak için new kullanın: int[] nums = new int[5]; - bu size 5 hücre verir; her biri varsayılan değerle doldurulur (int için 0, nesneler için null).
Java'da bir dizinin uzunluğunu nasıl alırım?
length alanını kullanın (parantezsiz): nums.length. Bu bir metot değil, bir alandır; dolayısıyla nums.length() bir derleme hatasıdır. Dikkat: String parantezli olarak .length() kullanır, ama diziler parantezsiz .length kullanır - klasik bir karışıklıktır.
Bir Java dizisi oluşturulduktan sonra boyut değiştirebilir mi?
Hayır. Bir Java dizisinin uzunluğu oluşturulduğunda belirlenir ve sabittir; onu büyütemez veya küçültemezsiniz. Yeniden boyutlanabilir bir listeye ihtiyacınız varsa ArrayList kullanın. Bir diziyi "yeniden boyutlandırmak" için daha büyük yeni bir dizi oluşturup elemanları kopyalamanız gerekir.
Java'da ArrayIndexOutOfBoundsException nedir?
Var olmayan bir indekse - 0'dan küçük ya da >= array.length olan - eriştiğinizde aldığınız çalışma zamanı hatasıdır. Bazı dillerin aksine Java, aralık dışı erişimde varsayılan bir değer ya da null döndürmez; istisna fırlatır. Geçerli indeksler her zaman 0'dan length - 1'e kadardır.