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

144

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]);

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

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

... trueimprimera 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 indices du tableau, 0ce qui signifierait que je n'ai pas à parcourir le tableau et à l'initialiser?

Merci.

Hristo
la source
6
Il suffit de lire la documentation;) docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5
Benj

Réponses:

281

Tout dans un programme Java non défini explicitement sur quelque chose par le programmeur, est initialisé à une valeur zéro.

  • Pour les références (tout ce qui contient un objet) qui est null.
  • Pour int / short / byte / long qui est un 0.
  • Pour float / double c'est un 0.0
  • Pour les booléens, c'est un false.
  • Pour char qui 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. Ainsi, votre tableau contient cinq zéros juste après sa création parnew .

Remarque (basée sur les commentaires): La machine virtuelle Java n'est pas obligée de remettre à 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 les valeurs aléatoires, la spécification du langage Java nécessite l'initialisation des variables locales.

Thorbjørn Ravn Andersen
la source
Les commentaires ne sont pas destinés à une discussion approfondie; cette conversation a été déplacée vers le chat .
Brad Larson
Tout sauf les variables locales, qui ne sont initialisées à rien, comme le compilateur vous le dira.
Marquis of Lorne
@ user207421 comme mentionné à la fin de la réponse.
Thorbjørn Ravn Andersen
Ce qui signifie que la première phrase de votre réponse n'est pas correcte et doit être modifiée. Et votre question «comment savez-vous» dans le chat n'a pas de sens. Le JLS le dit, c'est tout, et le compilateur l'applique, idem.
Marquis de Lorne
@ user207421 "n'est pas explicitement défini sur quelque chose par le programmeur" (ce qui peut être requis par le compilateur).
Thorbjørn Ravn Andersen
60

À partir 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 l'octet de type, 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 zéro positif, c'est-à-dire 0.0f .
    • Pour le type double, la valeur par défaut est zéro positif, c'est-à-dire 0.0d .
    • Pour le type char, la valeur par défaut est le caractère nul, 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.
Dave Costa
la source
2
Et qu'en est-il de Array of Long s et Integer s?
Georgy Dobrev
1
@GeorgyDobrev. Ce sont des types de référence. Ils seraient nuls selon la spécification ci-dessus.
Dave Costa
Qu'en est-il d'un tableau String?
Zac
1
@Zac comme ci-dessus, une chaîne est un objet, donc la valeur par défaut dans le tableau serait null.
Dave Costa
18

JLS dit clairement

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

et ceci 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.

Aniket Thakur
la source
1
Ne répond pas à la question. Il pose des questions sur l'initialisation par défaut.
Marquis of Lorne
3

Selon java,

Type de données - Valeurs par défaut

octet - 0

court - 0

int - 0

long - 0L

flotteur - 0.0f

double - 0,0d

char - '\ u0000'

Chaîne (ou tout objet) - null

booléen - faux

Abhishek Singh
la source
2
Il ne pose pas de questions sur les champs, il pose des questions sur les composants du tableau.
Marquis of Lorne
3
@EJP pouvez-vous préciser ce que signifie le composant de tableau ???? généralement, les tableaux ont un type de données (même type) qui est initialisé comme ci-dessus, alors pouvez-vous me dire, moyenne du composant ???
Abhishek Singh
3

Thorbjørn Ravn Andersen a répondu pour la plupart des types de données. Puisqu'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 une valeur par défaut lors de sa création"

Je pense que peu importe si le tableau est local ou une variable d'instance ou de classe, il sera avec des valeurs par défaut

nantitv
la source
2

Chaque classe en Java a un constructeur (un constructeur est une méthode qui est appelée lorsqu'un nouvel objet est créé, 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-là.

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

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

kkk
la source
1

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 size()méthode 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 renverra 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++;
}
RAJIV GUPTA
la source
2
Cela ressemble à ArrayList, pas à un tableau.
Thorbjørn Ravn Andersen