2010-10-08 13 views
74

En la práctica, puedo suponer que todos los arrays en Java int comenzará a cabo lleno de ceros? para todas las máquinas en las que se ejecuta la JVM?¿Podemos suponer valores de matriz por defecto en Java? por ejemplo, supongamos que una matriz int se establece en todos los ceros?

¿Esto es cierto para todos los tipos? ¿carbonizarse? booleano? enums?

¿Dónde está esto oficialmente documentado?

Los libros de texto que tengo dicen que las matrices en int se establecen en cero, pero también recomiendan que uno debe escribir un for-loop para establecer todos los valores en cero solo para "estar más claros".

+14

tirar todos esos libros de texto. En el peor que deberían te he dicho que hacer una llamada a' Arrays.fill (myArr, 0) ' Pero sigue siendo una sugerencia ridícula, realmente si se trata de una cuestión de claridad, haga un comentario maldito, no haga un trabajo innecesario. –

+5

El lenguaje Java garantiza que las variables se inicializan a un valor predeterminado (falso, 0, nulo, dependiendo de el tipo). No hay necesidad de inicializar manualmente una matriz, es solo un desperdicio de ciclos de CPU. –

+1

Esos libros de texto probablemente fueron escritos por programadores C/C++, para los cuales las matrices recientemente asignadas tienen contenido no definido. Java intenta evitar el comportamiento indefinido. – Raedwald

Respuesta

130

Java Language Specification es el lugar adecuado para buscar dicha información:

de componentes de matriz son variables no identificadas que se crean e inicializan a los valores por defecto (§4.12.5) cada vez que un nuevo objeto que es una matriz se crea

Los valores predeterminados están dados en section 4.12.5.

  • Para el tipo byte, el valor predeterminado es cero, es decir, el valor de (byte) 0.
  • Para el tipo corto, el valor predeterminado es cero, es decir, el valor de (corto) 0.
  • Para el tipo int, el valor predeterminado es cero, es decir, .
  • Para el tipo largo, el valor predeterminado es cero, es decir, 0L.
  • Para el 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 falso. Para todos los tipos de referencia, el valor predeterminado es nulo.
+0

¿puedes tratar el carácter nulo como cero? cálculo sabio? – committedandroider

+0

Gran respuesta. Tenía curiosidad sobre esto yo mismo. – ktm5124

17

Sí. Los tipos primitivos en Java siempre se inicializan en cero. Las referencias también se inicializan a nulo.

+4

+1 y para el registro, aquí está la especificación oficial: [Valores iniciales de variables] (http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html#96595) – casablanca

+2

This es correcto para valores de matriz y campos, pero no para variables locales. El compilador requiere que los inicialices tú mismo. –

+0

boolean se inicializa a falso, no a cero. –

4

¡Su libro de texto está equivocado! Escribir dicho código no tiene sentido, y es una pérdida de tiempo tipearlo y que las computadoras lo ejecuten.

Como han dicho otros, el compilador garantiza que las variables fuera de los métodos (variables de clase/instancia) reciban un valor de 0, falso o nulo. Como probablemente sepa, el compilador no proporciona variables dentro de los valores de los métodos y, en su lugar, le obliga a darles un valor antes de que se utilicen.

Encontrarás, si haces las cosas "bien", que aproximadamente el 90% -95% de tus "variables" nunca cambian después de que se les da un valor. Sin embargo, los nuevos programadores tienden a hacer cosas como esta:

int x = 0; 

// some code that never uses x 

x = 5; 

// more code that only reads x and never modifies it. 

esto le impide ser capaz de marcar x como "final". Si puede marcar x como "final", entonces evita la modificación accidental del valor, lo que evita errores.

que iba a escribir el código como:

final int x; 

// some code that never uses x 

x = 5; 

// more code that only reads x and never modifies it. 

Esto se llama un final (una variable final que no tenga un valor cuando se declara) en blanco.

Si recuerda que las variables de clase/instancia son inicializadas por el tiempo de ejecución, con suerte, no escribirá el código para inicializarlas con los valores desechables, y luego podrá marcarlas como definitivas.

Mi práctica personal es marcar siempre todo como final hasta que encuentre que debo modificarlo, y nunca inicializar una variable hasta que sepa el valor real que quiero que tenga. Hacer esto hace que el código sea más rápido (no se nota ya que las tareas son generalmente muy rápidas) y más seguro ya que rara vez modifico accidentalmente un valor cuando no debería hacerlo.

7

Debe ser la especificación de idioma de Java §4.12.5 Initial Values of Variables. en lugar de §4.5.5

"Para byte de tipo, el valor predeterminado es cero, es decir, el valor de (byte) 0.
Para el tipo corto, el valor predeterminado es cero, es decir, el valor de (corto) 0.
Para el tipo int, el valor predeterminado es cero, es decir, 0.
Para el tipo largo, el valor predeterminado es cero, es decir, 0L.
Para el tipo flotador, 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 va lue es el carácter nulo, es decir, '\ u0000'.
Para el tipo booleano, el valor predeterminado es falso.
Para todos los tipos de referencia (§ 4.3), el valor predeterminado es nulo."

Cuestiones relacionadas