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;
}
Réponses:
Une valeur par défaut de 0 pour les tableaux de types intégraux est garantie par la spécification du langage :
Si vous souhaitez initialiser un tableau unidimensionnel à une valeur différente, vous pouvez utiliser java.util.Arrays.fill () (qui utilisera bien sûr une boucle en interne).
la source
Arrays.fill
n'utilise pas nécessairement une boucle.Alors que les autres réponses sont correctes (les valeurs de tableau int sont par défaut initialisées à 0), si vous vouliez le faire explicitement (par exemple si vous vouliez un tableau rempli avec la valeur 42), vous pouvez utiliser la méthode fill () de la classe Arrays :
Ou si vous êtes un fan de 1-liners, vous pouvez utiliser la
Collections.nCopies()
routine:Donnerait à arr la valeur:
(bien que ce soit le cas
Integer
, et nonint
, si vous avez besoin du type primitif, vous pouvez vous en remettre à la routine Apache CommonsArrayUtils.toPrimitive()
:la source
List<Integer>
àInteger[]
laint[]
? C'est un peu compliqué.Arrays.fill
méthode crée un problème et une erreur se produit.Dans java tous les éléments (types entiers primitifs
byte
short
,int
,long
) sont initialisés à 0 par défaut. Vous pouvez enregistrer la boucle.la source
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 de tout objet peut être indiquée comme suit.
Pour l' octet de type , la valeur par défaut est zéro , c'est-à-dire que la valeur de (octet) est 0 .
Pour le type court , la valeur par défaut est zéro , c'est-à-dire que la valeur de (court) est 0 .
Pour le type int , la valeur par défaut est zéro , c'est-à-dire 0 .
Pour le type long , la valeur par défaut est zéro , c'est-à-dire 0L .
Pour le type float , la valeur par défaut est un zéro positif , c'est-à-dire 0,0f .
Pour le type double , la valeur par défaut est zéro positif , c'est-à-dire 0,0d .
Pour le type char , la valeur par défaut est le caractère nul , c'est-à-dire ' \ u0000 '.
Pour le type booléen , la valeur par défaut est false .
Pour tous les types de référence , la 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.
Parce qu'un tableau est un objet conteneur qui contient un nombre fixe de valeurs d'un seul type. Maintenant, le type de tableau pour vous est int, alors considérez que la valeur par défaut pour tous les éléments du tableau sera automatiquement 0 car il contient un type int .
Considérez maintenant le tableau pour le type String afin que tous les éléments du tableau aient la valeur par défaut est null .
Pourquoi ne fais pas ça ......?
vous pouvez attribuer une valeur nulle en utilisant la boucle comme vous le suggérez dans votre question.
Mais si vous le faites, cela entraînera une perte inutile du cycle de la machine. et si vous utilisez dans votre application où vous avez de nombreux tableaux et que vous le faites pour chaque tableau, cela affectera les performances de l'application jusqu'à un niveau considérable.
L'utilisation accrue du cycle machine ==> Plus de temps pour traiter les données ==> Le temps de sortie sera considérablement augmenté . afin que le traitement des données de votre application puisse être considéré comme un niveau bas (Ralentir jusqu'à un certain niveau).
la source
Vous pouvez enregistrer la boucle, l'initialisation est déjà effectuée à 0. Même pour une variable locale.
Mais veuillez corriger l'endroit où vous placez les crochets, pour plus de lisibilité (meilleure pratique reconnue):
la source
Si vous utilisez Float ou Integer, vous pouvez attribuer une valeur par défaut comme celle-ci ...
la source
Vous pouvez créer un nouveau tableau vide avec votre taille de tableau existante et vous pouvez les attribuer à votre tableau. Cela peut être plus rapide que les autres. Snipet:
Résultat :
la source
Oui, les valeurs int d'un tableau sont initialisées à zéro. Mais ce n'est pas garanti. La documentation Oracle indique qu'il s'agit d'une mauvaise pratique de codage.
la source
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 devez réellement définir des valeurs de tableau à zéro et que vous souhaitez optimiser cela, utilisez
System.arraycopy
:Cela utilise
memcpy
sous les couvertures dans la plupart ou toutes les implémentations JRE. Notez que l'utilisation d'une statique comme celle-ci est sûre même avec plusieurs threads, car le pire des cas est la réallocation de plusieurs threadszeros
simultanée de , ce qui ne fait rien de mal.Vous pouvez également utiliser
Arrays.fill
comme d'autres l'ont mentionné.Arrays.fill
pourrait utilisermemcpy
dans une JVM intelligente, mais n'est probablement qu'une boucle Java et la vérification des limites que cela implique.Benchmarkez vos optimisations, bien sûr.
la source
Encore une autre approche en utilisant lambda au-dessus de java 8
la source
Dans c / cpp il n'y a pas de raccourci mais pour initialiser tous les tableaux avec l'indice zéro.
Mais en java, il existe un outil magique appelé Arrays.fill () qui remplira toutes les valeurs d'un tableau avec l'entier de votre choix.
la source
L'initialisation n'est pas requise en cas de zéro car la valeur par défaut de int en Java est zéro. Pour les valeurs autres que zéro,
java.util.Arrays
plusieurs options sont disponibles, la plus simple étant la méthode fill.Nous pouvons également utiliser Arrays.setAll () si nous voulons remplir la valeur sous condition:
la source
déclarer 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 ne devez plus vous inquiéter
la source
résultat 0123456 -1012345 -2-101234 -3-2-10123 -4-3-2-1012 -5-4-3-2-101 -6-5-4-3-2-10
la source