2010-08-06 17 views
102

Así que estoy declarar e inicializar un array int:¿Cuál es la inicialización predeterminada de una matriz en Java?

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

digo que este lugar ...

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

... 0 imprimirá en 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); 

... true imprimirá en la salida estándar. Entonces, ¿cómo está Java inicializando mi matriz por defecto? ¿Es seguro suponer que la inicialización predeterminada es establecer los índices de matriz en 0 lo que significa que no tengo que recorrer el conjunto e inicializarlo?

Gracias.

+3

Acabo de leer los documentos;) http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 – Benj

Respuesta

215

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

  • Para las referencias (cualquier cosa que tenga un objeto) que es null.
  • Para int/short/byte/long que es 0.
  • Para flotante/doble que es un 0.0
  • Para booleanos que es un false.
  • Para char que 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 haber sido creada por new.

Nota (basada en comentarios): Java Virtual Machine no necesita poner a cero la memoria subyacente al asignar variables locales (esto permite operaciones de pila eficientes si es necesario) para evitar valores aleatorios la Especificación del lenguaje Java requiere variables locales ser inicializado

+0

Los comentarios no son para una discusión extensa; esta conversación ha sido [movida al chat] (http://chat.stackoverflow.com/rooms/158333/discussion-on-answer-by-thorbjorn-ravn-andersen-what-is-the-default-initializati). –

48

Desde el Java Language Specification:

  • 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 tipo byte, el valor predeterminado es cero, es decir, el valor de (byte)0.
    • Para tipo abreviado, el valor predeterminado es cero, es decir, el valor de (short)0.
    • Para tipo int, el valor predeterminado es cero, es decir, 0.
    • Para tipo largo, el valor predeterminado es cero, es decir, 0L.
    • Para tipo flotante, el valor predeterminado es cero positivo, es decir, 0.0f.
    • Para el tipo doble, el valor predeterminado es cero positivo, es decir, 0.0d.
    • Para el tipo char, el valor predeterminado 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 s y Integer s? –

+1

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

+0

¿Qué tal una matriz de cadenas? – Zac

16

JLS dice claramente

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

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

valores por defecto para los tipos primitivos: docs

Para valores por defecto objetos es null.

+1

No responde la pregunta. Él está preguntando sobre la inicialización predeterminada. – EJP

2

De acuerdo con java,

Tipo de datos - Los valores por defecto

bytes - 0

corta - 0

int - 0

larga - 0L

flotador - 0.0f

doble - 0.0d

Char - '\ u0000'

cadena (o cualquier objeto) - nula

booleano - falsa

+2

No pregunta por los campos, pregunta por los componentes de la matriz. – EJP

+2

@EJP ¿puede por favor elaborar cuál es la media del componente de matriz? En general, array tiene algún tipo de datos (del mismo tipo) que se inicializa como se indica arriba, así que ¿puede decirme por favor qué significa componente? –

2

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 método size() 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

Cada clase en Java tienen 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 al crear el objeto y todos los valores de datos se inicializan en ese momento.

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

Así Java está inicializando la matriz mediante la ejecución Es método constructor al crear el objeto

2

Thorbjørn Ravn Andersen respondió por la mayoría de los tipos de datos. Dado que hubo una fuerte discusión acerca matriz,

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

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

Cuestiones relacionadas