¿Cuál es la inicialización predeterminada de una matriz en Java?


144

Entonces estoy declarando e inicializando una matriz int:

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

Digamos que hago esto en su lugar ...

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

... 0se imprimirá a la salida estándar. Además, si hago esto:

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

... truese imprimirá a la salida estándar. Entonces, ¿cómo está Java inicializando mi matriz por defecto? ¿Es seguro asumir que la inicialización predeterminada es establecer los índices de la matriz, 0lo que significa que no tengo que recorrer la matriz e inicializarla?

Gracias.


Respuestas:


281

Todo en un programa Java que el programador no establece explícitamente en algo, se inicializa a un valor cero.

  • Para referencias (cualquier cosa que contenga un objeto) que es null.
  • Para int / short / byte / long que es a 0.
  • Para flotante / doble que es un 0.0
  • Para booleanos que es un false.
  • Para char, ese es el carácter nulo '\u0000'(cuyo equivalente decimal es 0).

Cuando crea una matriz de algo, todas las entradas también se ponen a cero. Entonces, su matriz contiene cinco ceros justo después de ser creada pornew .

Nota (basada en comentarios): la máquina virtual Java no necesita poner a cero la memoria subyacente al asignar variables locales (esto permite operaciones de apilamiento eficientes si es necesario) para evitar valores aleatorios, la especificación del lenguaje Java requiere que se inicialicen las variables locales.


Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Brad Larson

Todo excepto las variables locales, que no se inicializan a nada, como el compilador le dirá.
Marqués de Lorne

@ user207421 como se menciona al final de la respuesta.
Thorbjørn Ravn Andersen

Lo que significa que la primera oración de su respuesta no es correcta y debe modificarse. Y tu pregunta de 'cómo sabes' en el chat no tiene sentido. El JLS lo dice, eso es todo, y el compilador lo aplica, lo mismo.
Marqués de Lorne

@ user207421 "no programado explícitamente en algo por el programador" (que puede ser requerido por el compilador).
Thorbjørn Ravn Andersen

60

De la especificación del lenguaje Java :

  • Cada variable de clase, variable de instancia o componente de matriz se inicializa con un valor predeterminado cuando se crea (§15.9, §15.10):

    • Para el byte de tipo, el valor predeterminado es cero, es decir, el valor de (byte)0.
    • Para el tipo short, el valor predeterminado es cero, es decir, el valor de (short)0.
    • Para el tipo int, el valor predeterminado es cero, es decir, 0.
    • Para el tipo de largo, el valor predeterminado es cero, es decir, 0L.
    • Por tipo float, el valor por defecto es cero positivo, es decir, 0.0f.
    • Para el tipo de matrimonio, el valor por defecto es cero positivo, es decir, 0.0d.
    • Por tipo char, el valor por defecto es el carácter nulo, es decir, '\u0000'.
    • Para el tipo booleano, el valor predeterminado es false.
    • Para todos los tipos de referencia (§4.3), el valor predeterminado es null.

2
¿Y qué hay de Array of Long sy Integer s?
Georgy Dobrev

1
@GeorgyDobrev. Esos son tipos de referencia. Serían nulos de acuerdo con la especificación anterior.
Dave Costa

¿Qué pasa con una matriz de cadenas?
Zac

1
@Zac igual que el anterior, una cadena es un objeto, por lo que el valor predeterminado en la matriz sería null.
Dave Costa

18

JLS dice claramente

Un inicializador de matriz crea una matriz y proporciona valores iniciales para todos sus componentes.

y esto es independiente de si la matriz es una variable de instancia o variable local o variable de clase.

Valores predeterminados para tipos primitivos: docs

Para los objetos, los valores predeterminados son null.


1
No responde la pregunta. Él está preguntando sobre la inicialización predeterminada.
Marqués de Lorne

3

De acuerdo con Java,

Tipo de datos: valores predeterminados

byte - 0

corto - 0

int - 0

largo - 0L

flotador - 0.0f

doble - 0.0d

char - '\ u0000'

Cadena (o cualquier objeto): nulo

booleano - falso


2
No pregunta por los campos, pregunta por los componentes de la matriz.
Marqués de Lorne

3
@EJP, ¿puedes explicar qué significa el componente de matriz? en general, la matriz tiene algún tipo de datos (mismo tipo) que se inicializa como se indica arriba, ¿puede decirme qué significa componente?
Abhishek Singh

3

Thorbjørn Ravn Andersen respondió para la mayoría de los tipos de datos. Como hubo una acalorada discusión sobre la matriz,

Citando de la especificación jls http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "el componente de matriz se inicializa con un valor predeterminado cuando se crea"

Creo que independientemente de si la matriz es local o de instancia o variable de clase, lo hará con valores predeterminados


2

Cada clase en Java tiene un constructor (un constructor es un método que se llama cuando se crea un nuevo objeto, que inicializa los campos de las variables de clase). Entonces, cuando está creando una instancia de la clase, se llama al método constructor mientras se crea el objeto y todos los valores de datos se inicializan en ese momento.

Para el objeto de tipo de matriz entera, todos los valores de la matriz se inicializan a 0 (cero) en el método del constructor. De manera similar para el objeto de una matriz booleana, todos los valores se inicializan en falso.

Entonces Java está inicializando la matriz ejecutando su método constructor mientras crea el objeto


1

Java dice que la longitud predeterminada de una matriz JAVA en el momento de la inicialización será 10.

private static final int DEFAULT_CAPACITY = 10;

Pero el size()método devuelve el número de elementos insertados en la matriz y, dado que en el momento de la inicialización, si no ha insertado ningún elemento en la matriz, devolverá cero.

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
Esto se parece a ArrayList, no a una matriz.
Thorbjørn Ravn Andersen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.