Java'da bir dizinin varsayılan başlatması nedir?


145

Yani bir int dizisi bildiriyorum ve başlatıyorum:

static final int UN = 0;
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
    arr[i] = UN;
}

Bunun yerine bunu yaptığımı söyle ...

int[] arr = new int[5];
System.out.println(arr[0]);

... 0standart çıktı yazdıracak. Ayrıca, bunu yaparsam:

static final int UN = 0;
int[] arr = new int[5];
System.out.println(arr[0]==UN);

... truestandart çıktı yazdıracak. Öyleyse Java varsayılan olarak dizimi nasıl başlatıyor? Varsayılan başlatmanın dizi indekslerini ayarladığını varsaymak güvenli 0midir, bu da dizi boyunca döngü yapmam ve onu başlatmam gerekmediği anlamına gelir mi?

Teşekkürler.


Yanıtlar:


287

Bir Java programındaki, programcı tarafından açıkça bir şeye ayarlanmayan her şey, sıfır değeriyle başlatılır.

  • Yani referanslar için (bir nesneyi tutan her şey) null.
  • İnt / short / byte / long için bir 0.
  • Float / double için bu bir 0.0
  • Boole'ler için bu bir false.
  • Boş karakter '\u0000'olan char için (ondalık eşdeğeri 0'dır).

Bir şey dizisi oluşturduğunuzda, tüm girişler de sıfırlanır. Yani diziniz, tarafından oluşturulduktan hemen sonra beş sıfır içerirnew .

Not (açıklamalara göre): Java Sanal Makinesi'nin, yerel değişkenleri tahsis ederken temeldeki belleği sıfırlaması gerekmez (bu, gerekirse verimli yığın işlemlerine izin verir), bu nedenle rasgele değerlerden kaçınmak için Java Dil Belirtimi yerel değişkenlerin başlatılmasını gerektirir.


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Brad Larson

Derleyicinin size söyleyeceği gibi, hiçbir şey için başlatılmamış yerel değişkenler dışındaki her şey.
Marquis of Lorne

@ user207421 cevabın sonunda belirtildiği gibi.
Thorbjørn Ravn Andersen

Bu, cevabınızın ilk cümlesinin doğru olmadığı ve düzeltilmesi gerektiği anlamına gelir. Ve sohbetteki 'nasıl biliyorsun' sorusu anlamsız. JLS öyle diyor, işte bu ve derleyici bunu uyguluyor, aynen.
Marquis of Lorne

@ user207421 "programcı tarafından açıkça bir şeye ayarlanmadı" (derleyici tarafından gerekli olabilir).
Thorbjørn Ravn Andersen

62

Gönderen Java Dil Şartname :

  • Her bir sınıf değişkeni, durum değişkeni veya dizi bileşeni, oluşturulduğunda varsayılan bir değerle başlatılır (§15.9, §15.10):

    • Tip bayt için varsayılan değer sıfırdır, yani değeridir (byte)0.
    • Kısa tip için varsayılan değer sıfırdır, yani değeridir (short)0.
    • İnt türü için varsayılan değer sıfırdır, yani 0.
    • Uzun tip için varsayılan değer sıfırdır, yani 0L.
    • Float türü için varsayılan değer pozitif sıfırdır, yani 0.0f.
    • Double türü için varsayılan değer pozitif sıfırdır, yani 0.0d.
    • Char türü için varsayılan değer boş karakterdir, yani '\u0000'.
    • Boolean türü için varsayılan değer şudur false.
    • Tüm referans türleri için (§4.3), varsayılan değer null.

2
Uzun diziler ve Tamsayılar ne olacak?
Georgy Dobrev

1
@GeorgyDobrev. Bunlar referans türleridir. Yukarıdaki spesifikasyona göre boş olacaktır.
Dave Costa

String dizisi ne olacak?
Zac

1
@Zac yukarıdakiyle aynıdır, String bir nesnedir, dolayısıyla dizideki varsayılan değer olacaktır null.
Dave Costa

19

JLS açıkça söylüyor

Bir dizi başlatıcı bir dizi oluşturur ve tüm bileşenleri için başlangıç ​​değerleri sağlar.

ve bu, dizinin bir örnek değişkeni veya yerel değişken veya sınıf değişkeni olup olmadığından bağımsızdır.

İlkel türler için varsayılan değerler: docs

Nesneler için varsayılan değerler null.


1
Soruyu cevaplamıyor. Varsayılan başlatma hakkında soru soruyor.
Lorne Markisi

3

Java'ya göre,

Veri Türü - Varsayılan değerler

bayt - 0

kısa - 0

int - 0

uzun - 0L

şamandıra - 0.0f

çift ​​- 0.0d

karakter - "\ u0000"

String (veya herhangi bir nesne) - null

boolean - yanlış


2
Alanları sormuyor, dizi bileşenleri hakkında soru soruyor.
Lorne Markisi

3
@EJP dizi bileşeninin ne anlama geldiğini açıklayabilir misiniz ???? Genel olarak dizi, yukarıdaki gibi başlatılan bazı veri tiplerine (aynı tip) sahiptir, bu yüzden lütfen bana, bileşenin ortalamasını söyleyebilir misiniz ???
Abhishek Singh

3

Thorbjørn Ravn Andersen, veri türlerinin çoğu için yanıt verdi. Dizi hakkında hararetli bir tartışma olduğu için,

Jls spec http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "dizi bileşeni oluşturulduğunda varsayılan bir değerle başlatılır"

Dizinin yerel mi, örnek mi yoksa sınıf değişkeni mi olduğuna bakılmaksızın varsayılan değerlerle olacağını düşünüyorum.


2

Java'daki her sınıfın bir kurucusu vardır (yapıcı, sınıf değişkenlerinin alanlarını başlatan, yeni bir nesne oluşturulduğunda çağrılan bir yöntemdir). Dolayısıyla, sınıfın bir örneğini oluşturduğunuzda, nesneyi oluştururken yapıcı yöntemi çağrılır ve o anda tüm veri değerleri başlatılır.

Tamsayı dizi türü nesnesi için dizideki tüm değerler yapıcı yönteminde 0 (sıfır) olarak başlatılır. Boole dizisinin nesnesi için de benzer şekilde, tüm değerler false olarak başlatılır.

Yani Java, nesneyi oluştururken yapıcı yöntemini çalıştırarak diziyi başlatıyor


1

Java, başlatma anında bir JAVA dizisinin varsayılan uzunluğunun 10 olacağını söylüyor.

private static final int DEFAULT_CAPACITY = 10;

Fakat size() yöntem, diziye eklenen öğelerin sayısını döndürür ve başlatma anında diziye herhangi bir öğe eklemediyseniz, sıfır döndürür.

private int size;

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

public void add(int index, E element) {
    rangeCheckForAdd(index);
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,size - index);
    elementData[index] = element;
    size++;
}

2
Bu ArrayList'e benziyor, bir dizi değil.
Thorbjørn Ravn Andersen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.