En lo C/C++
que solía hacer
int arr[10] = {0};
... para inicializar todos mis elementos de matriz a 0.
¿Hay un atajo similar en Java?
Quiero evitar usar el bucle, ¿es posible?
int arr[] = new int[10];
for(int i = 0; i < arr.length; i++) {
arr[i] = 0;
}
Respuestas:
La especificación del idioma garantiza un valor predeterminado de 0 para las matrices de tipos integrales :
Si desea inicializar una matriz unidimensional a un valor diferente, puede usar java.util.Arrays.fill () (que por supuesto usará un bucle internamente).
fuente
Arrays.fill
no necesariamente usa un bucle.Si bien las otras respuestas son correctas (los valores de la matriz int se inicializan por defecto a 0), si desea hacerlo explícitamente (por ejemplo, si desea una matriz llena con el valor 42), puede usar el método fill () de la clase Arrays :
O si eres un fanático de 1-liners, puedes usar la
Collections.nCopies()
rutina:Daría arr el valor:
(aunque es
Integer
, y noint
, si necesita el tipo primitivo, puede diferir a la rutina Apache CommonsArrayUtils.toPrimitive()
:fuente
List<Integer>
paraInteger[]
quéint[]
? Eso es un poco complicado.Arrays.fill
método está creando un problema y se produce un error.En Java todos los elementos (tipos enteros primitivos
byte
short
,int
,long
) se inicializan a 0 por defecto. Puedes guardar el bucle.fuente
¿Cómo reduce el rendimiento de su aplicación ...? Leer a continuación.
En la especificación del lenguaje Java, el valor predeterminado / inicial para cualquier objeto se puede dar como sigue.
Para el tipo byte , el valor predeterminado es cero , es decir, el valor de (byte) es 0 .
Para el tipo short , el valor predeterminado es cero , es decir, el valor de (short) es 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 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 .
Al considerar todo esto, no necesita inicializar con valores cero para los elementos de la matriz porque, de forma predeterminada, todos los elementos de la matriz son 0 para int array.
Porque Una matriz es un objeto contenedor que contiene un número fijo de valores de un solo tipo. Ahora el tipo de matriz para usted es int, por lo tanto, considere que el valor predeterminado para todos los elementos de la matriz será automáticamente 0 porque contiene int type .
Ahora considere la matriz para el tipo de cadena para que todos los elementos de la matriz tengan un valor predeterminado es nulo .
¿Por qué no haces eso ......?
puede asignar un valor nulo utilizando el bucle como sugiere en su Pregunta.
Pero si lo hace, será una pérdida inútil del ciclo de la máquina. y si utiliza en su aplicación donde tiene muchas matrices y lo hace para cada matriz, afectará el rendimiento de la aplicación hasta un nivel considerable.
El mayor uso del ciclo de la máquina ==> Más tiempo para procesar los datos ==> El tiempo de salida aumentará significativamente . para que el procesamiento de datos de su aplicación pueda considerarse como un nivel bajo (Reduzca la velocidad hasta cierto nivel).
fuente
Puede guardar el ciclo, la inicialización ya está hecha a 0. Incluso para una variable local.
Pero corrija el lugar donde coloca los corchetes, para facilitar la lectura (mejor práctica reconocida):
fuente
Si está utilizando Float o Integer, puede asignar un valor predeterminado como este ...
fuente
Puede crear una nueva matriz vacía con su tamaño de matriz existente, y puede asignarlos nuevamente a su matriz. Esto puede ser más rápido que otro. Snipet:
Resultado:
fuente
Sí, los valores int en una matriz se inicializan a cero. Pero no tienes garantizado esto. La documentación de Oracle indica que esta es una mala práctica de codificación.
fuente
Los valores int ya son cero después de la inicialización, como todos han mencionado. Si tiene una situación en la que realmente necesita establecer los valores de la matriz a cero y desea optimizar eso, use
System.arraycopy
:Esto se utiliza
memcpy
debajo de las cubiertas en la mayoría o en todas las implementaciones de JRE. Tenga en cuenta que el uso de una estática como esta es segura incluso con múltiples subprocesos, ya que el peor de los casos es que varios subprocesos se reasignenzeros
simultáneamente, lo que no hace daño a nada.También podría usar
Arrays.fill
como algunos otros han mencionado.Arrays.fill
podría usarsememcpy
en una JVM inteligente, pero probablemente sea solo un bucle de Java y la comprobación de límites que conlleva.Compare sus optimizaciones, por supuesto.
fuente
Otro enfoque más usando lambda sobre java 8
fuente
En c / cpp no hay acceso directo sino inicializar todas las matrices con el subíndice cero.
Pero en java hay una herramienta mágica llamada Arrays.fill () que llenará todos los valores en una matriz con el entero de su elección.
fuente
La inicialización no es necesaria en caso de cero porque el valor predeterminado de int en Java es cero. Para valores distintos de cero,
java.util.Arrays
ofrece una serie de opciones, la más simple es el método de relleno.También podemos usar Arrays.setAll () si queremos completar el valor en función de la condición:
fuente
declare la matriz como variable de instancia en la clase, es decir, fuera de cada método y JVM le dará 0 como valor predeterminado. No necesitas preocuparte más
fuente
resultado 0123456 -1012345 -2-101234 -3-2-10123 -4-3-2-1012 -5-4-3-2-101 -6-5-4-3-2-10
fuente