web-dev-qa-db-fra.com

Quelle est l'initialisation par défaut d'un tableau en Java?

Donc, je déclare et initialise un tableau int:

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

Dis que je fais ça à la place ...

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

... 0 imprimera en sortie standard. Aussi, si je fais ça:

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

... true imprimera en sortie standard. Alors, comment Java initialise-t-il mon tableau par défaut? Est-il prudent de supposer que l'initialisation par défaut définit les index du tableau sur 0, ce qui signifie que je n'ai pas à parcourir le tableau et à l'initialiser?

Merci.

132
Hristo

Tout ce qui se trouve dans un programme Java non explicitement défini par quelque chose par le programmeur est initialisé à une valeur nulle.

  • Pour les références (tout ce qui contient un objet), c'est null.
  • Pour int/short/byte/long, il s'agit d'un 0.
  • Pour float/double, il s'agit d'un 0.0
  • Pour les booléens, il s'agit d'un false.
  • Pour char, c’est le caractère nul '\u0000' (dont l’équivalent décimal est 0).

Lorsque vous créez un tableau de quelque chose, toutes les entrées sont également mises à zéro. Donc votre tableau contient cinq zéros juste après sa création par new.

Remarque (en fonction des commentaires): La machine virtuelle Java n'est pas obligée de mettre à zéro la mémoire sous-jacente lors de l'allocation de variables locales (cela permet des opérations de pile efficaces si nécessaire) afin d'éviter des valeurs aléatoires comme spécification du langage Java. nécessite que les variables locales soient initialisées.

257

De la spécification du langage Java :

  • Chaque variable de classe, variable d'instance ou composant de tableau est initialisé avec une valeur par défaut lors de sa création (§15.9, §15.10):

    • Pour le type octet, la valeur par défaut est zéro, c'est-à-dire la valeur de (byte)0.
    • Pour le type short, la valeur par défaut est zéro, c'est-à-dire la valeur de (short)0.
    • Pour le type int, la valeur par défaut est zéro, c'est-à-dire 0.
    • Pour le type long, la valeur par défaut est zéro, c'est-à-dire 0L.
    • Pour le type float, la valeur par défaut est positive zéro, c'est-à-dire 0.0f.
    • Pour le type double, la valeur par défaut est positive zéro, c'est-à-dire 0.0d.
    • Pour le type char, la valeur par défaut est le caractère null, c'est-à-dire '\u0000'.
    • Pour le type booléen, la valeur par défaut est false.
    • Pour tous les types de référence (§4.3), la valeur par défaut est null.
56
Dave Costa

JLS dit clairement

Un initialiseur de tableau crée un tableau et fournit les valeurs initiales de tous ses composants.

et cela indépendamment du fait que le tableau soit une variable d'instance ou une variable locale ou une variable de classe.

Valeurs par défaut pour les types primitifs: docs

Pour les objets, les valeurs par défaut sont null.

18
Aniket Thakur

Thorbjørn Ravn Andersen a répondu pour la plupart des types de données. Comme il y avait une discussion animée sur le tableau,

Citant la spécification jls http://docs.Oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "le composant de tableau est initialisé avec un valeur par défaut lors de la création "

Je pense que indépendamment du tableau est local ou variable d'instance ou de classe, il sera avec des valeurs par défaut

3
nantitv

Java indique que la longueur par défaut d'un tableau Java au moment de l'initialisation sera de 10.

private static final int DEFAULT_CAPACITY = 10;

Mais la méthode size() renvoie le nombre d'éléments insérés dans le tableau et, puisque, au moment de l'initialisation, si vous n'avez inséré aucun élément dans le tableau, elle renvoie zéro.

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
RAJIV GUPTA

Selon Java,

Type de données - valeurs par défaut

octet - 0

court - 0

int - 0

long - 0L

float - 0.0f

double - 0.0d

char - '\ u0000'

String (ou n'importe quel objet) - null

booléen - faux

2
Abhishek Singh

Chaque classe de Java a un constructeur (un constructeur est une méthode appelée lors de la création d'un nouvel objet, qui initialise les champs des variables de classe). Ainsi, lorsque vous créez une instance de la classe, la méthode constructeur est appelée lors de la création de l'objet et toutes les valeurs de données sont initialisées à ce moment.

Pour les objets de type tableau entier, toutes les valeurs du tableau sont initialisées à 0(zero) dans la méthode du constructeur. De même pour l'objet de tableau booléen, toutes les valeurs sont initialisées à false.

Donc, Java initialise le tableau en exécutant sa méthode de constructeur lors de la création de l'objet

2
kkk