Tout raccourci pour initialiser tous les éléments du tableau à zéro?
Dans C/C++
je faisais
int arr[10] = {0};
Pour initialiser tous mes éléments de tableau à 0.
Existe-t-il un raccourci similaire en Java?
je veux éviter d'utiliser la boucle, est-ce possible?
int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
arr[i] = 0;
13 réponses
Une valeur par défaut de 0 pour les tableaux de types intégraux est garantie par la spécification de langage :
Chaque variable de classe, variable d'instance ou composant de tableau est initialisée avec une valeur par défaut lors de sa création (§15.9, §15.10) [...] Pour le type
int
, la valeur par défaut est zéro, qui est,0
.
Si vous souhaitez initialiser un tableau à une valeur différente, vous pouvez utiliser java.util.Tableau.fill () (qui utilisera bien sûr une boucle interne).
Alors que les autres réponses sont correctes (les valeurs int array sont par défaut initialisées à 0), si vous voulez le faire explicitement (disons par exemple si vous voulez un tableau rempli avec la valeur 42), Vous pouvez utiliser la méthode fill () de la classeArrays :
int [] myarray = new int[num_elts];
Arrays.fill(myarray, 42);
, Ou si vous êtes un fan de la 1-liners, vous pouvez utiliser le Collections.nCopies()
routine:
Integer[] arr = Collections.nCopies(3, 42).toArray(new Integer[0]);
Donnerait à arr la valeur:
[42, 42, 42]
(bien que ce soit Integer
, et non int
, Si vous avez besoin du type primitif, vous pouvez reporter le Apache Commons ArrayUtils.toPrimitive()
routine:
int [] primarr = ArrayUtils.toPrimitive(arr);
En java, tous les éléments sont initialisés à 0 par défaut. Vous pouvez enregistrer la boucle.
Comment cela réduit les performances de votre application....? Lire La Suite.
Dans la spécification du langage Java, la valeur par défaut / initiale pour tout objet peut être donnée comme suit.
De type byte, le valeur par défaut est zéro, c'est la valeur de (byte) est 0.
De type court - , le valeur par défaut est zéro, c'est la valeur de (court-circuit) 0.
Pour le type int, Le valeur par défaut est zéro, c'est-à, 0.
De type long, le valeur par défaut est zéro, qui est, 0L.
De type float, le valeur par défaut est positif zéro, qui est, 0.0 f.
De type double - , le valeur par défaut est positif zéro, qui est, 0.0 d.
De type char, le valeur par défaut est le null caractère, c'est-à-dire '\u0000'.
De type boolean, le valeur par défaut est false.
Pour tous les types de référence, le valeur par défaut est null.
En considérant tout cela, vous n'avez pas besoin d'initialiser avec des valeurs nulles pour les éléments du tableau car par défaut tous les éléments du tableau sont 0 pour le tableau int.
, Car Un matrice est un objet conteneur qui contient un nombre fixe de valeurs d'un type unique. Maintenant, le type de tableau pour vous est int alors considérez la valeur par défaut pour tous les éléments de tableau sera automatiquement 0 car il est contenant le type int.
Maintenant envisager le matrice pour type de Chaîne, de sorte que tous les éléments du tableau a valeur par défaut est null.
Pourquoi ne pas faire ça?.....?
Vous pouvez attribuer une valeur null en utilisant loop comme vous le suggérez dans votre Question.
int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
arr[i] = 0;
Mais si vous ne donc, il sera une perte inutile du cycle de la machine. et si vous utilisez dans votre application où vous avez beaucoup de tableaux et que vous le faites pour chaque tableau, cela affectera les performances de l'Application jusqu'à un niveau considérable.
Le plus utiliser de machine cycle ==> Plus de temps pour traiter les données = = > temps de sortie sera considérablement augmenter . de sorte que le traitement de vos données d'application peut être considéré comme un niveau bas(lent-à un certain niveau).
, Vous pouvez enregistrer la boucle, l'initialisation est déjà à 0. Même pour une variable locale.
Mais veuillez corriger l'endroit où vous placez les crochets, pour plus de lisibilité (meilleure pratique reconnue):
int[] arr = new int[10];
Si vous utilisez Float ou Integer, vous pouvez attribuer une valeur par défaut comme ceci ...
Integer[] data = new Integer[20];
Arrays.fill(data,new Integer(0));
Vous pouvez créer un nouveau tableau vide avec la taille de votre tableau existant, et vous pouvez les attribuer à votre tableau. Cela peut plus vite que les autres. Snipet:
package com.array.zero;
public class ArrayZero {
public static void main(String[] args) {
// Your array with data
int[] yourArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//Creating same sized array with 0
int[] tempArray = new int[yourArray.length];
Assigning temp array to replace values by zero [0]
yourArray = tempArray;
//testing the array size and value to be zero
for (int item : yourArray) {
System.out.println(item);
}
}
}
Résultat :
0
0
0
0
0
0
0
0
0
Oui, les valeurs int d'un tableau sont initialisées à zéro. Mais vous n'êtes pas garanti cela. La documentation Oracle indique qu'il s'agit d'une mauvaise pratique de codage.
Les valeurs int sont déjà nulles après l'initialisation, comme tout le monde l'a mentionné. Si vous avez une situation où vous avez réellement besoin de définir les valeurs du tableau à zéro et que vous voulez optimiser cela, utilisez System.arraycopy
:
static private int[] zeros = new float[64];
...
int[] values = ...
if (zeros.length < values.length) zeros = new int[values.length];
System.arraycopy(zeros, 0, values, 0, values.length);
Cela utilise memcpy
sous les couvertures dans la plupart ou toutes les implémentations JRE. Notez que l'utilisation d'un statique comme celui-ci est sûre même avec plusieurs threads, car le pire des cas est que plusieurs threads réallouent zeros
simultanément, ce qui ne fait rien de mal.
Vous pouvez également utiliser Arrays.fill
comme d'autres l'ont mentionné. Arrays.fill
pourrait utiliser memcpy
dans une JVM intelligente, mais est probablement juste une boucle Java et la vérification des limites que cela implique.
Benchmark vos optimisations, bien sûr.
Encore une autre approche en utilisant lambda au-dessus de java 8
Arrays.stream(new Integer[nodelist.size()]).map(e ->
Integer.MAX_VALUE).toArray(Integer[]::new);
Déclarez le tableau comme variable d'instance dans la classe, c'est-à-dire hors de chaque méthode et JVM lui donnera 0 comme valeur par défaut. Vous n'avez plus besoin de vous inquiéter
En c / cpp, il n'y a pas de raccourci mais pour initialiser tous les tableaux avec l'indice zéro.Ex:
int arr[10] = {0};
Mais en java il y a un outil magique appelé tableaux.fill() qui remplira toutes les valeurs d'un tableau avec l'entier de votre choix.Ex:
import java.util.Arrays;
public class Main
{
public static void main(String[] args)
{
int ar[] = {2, 2, 1, 8, 3, 2, 2, 4, 2};
Arrays.fill(ar, 10);
System.out.println("Array completely filled" +
" with 10\n" + Arrays.toString(ar));
}
}
int a=7, b=7 ,c=0,d=0;
int dizi[][]=new int[a][b];
for(int i=0;i<a;i++){
for(int q=d;q<b;q++){
dizi[i][q]=c;
System.out.print(dizi[i][q]);
c++;
}
c-=b+1;
System.out.println();
}
Résultat 0123456 -1012345 -2-101234 -3-2-10123 -4-3-2-1012 -5-4-3-2-101 -6-5-4-3-2-10