Ajout des objets définis par l'utilisateur à la liste de tableaux en Java
Je veux ajouter un type défini par l'utilisateur, comme celui illustré ci-dessous, une ArrayList
.
import java.util.ArrayList;
class MyObj
{
int iX;
}
public class testForLoopjava
{
public static void main(String[] args)
{
MyObj ob1 = new MyObj();
ArrayList<MyObj> al = new ArrayList<MyObj>();
int a,b;
for(int i =0;i<5;i++)
{
ob1.iX = i + 5;
al.add(ob1);
}
for(int j=0;j<5;j++)
System.out.println("iX: "+al.get(j).iX);
}
}
Lorsque j'essaie d'imprimer le code ci-dessus, iX
toujours imprime 9
. c'est à dire iX
est mise à jour par la dernière valeur dans la liste. Quelle est la raison? Suis-je en train de faire quelque erreur de base.?
De sortie:
iX: 9
iX: 9
iX: 9
iX: 9
iX: 9
OriginalL'auteur SyncMaster | 2011-11-22
Vous devez vous connecter pour publier un commentaire.
Vous êtes en train d'ajouter la même objet de la liste à chaque fois. Vous devez utiliser une nouvelle instance créée au sein de la boucle.
par exemple-
Sinon, votre liste va contenir une liste de références à la même instance et la modification des un instance affecte chaque entrée de la liste.
Ce genre de question est un argument fort pour l'utilisation de immuable objets dans la mesure du possible. Si vous le pouvez, une bonne approche est d'instancier le
iX
champ dans le constructeur et fairefinal
donc ne lui permettant pas de changement après l'instanciation (découvrez la Javafinal
mot-clé).Cette approche peut donner une solution plus sûre (wrt. le ci-dessus) avec la mise en garde que vos objets peuvent être modifiés après l'instanciation. Il sonne comme une pratique restrictive, mais vous serez surpris de trouver un grand nombre de vos objets peuvent être mis en œuvre dans ce mode.
OriginalL'auteur Brian Agnew
C'est parce que vous êtes toujours mettre la même instance (le même objet) dans votre liste.
essayer:
OriginalL'auteur Shivan Dragon
Vous êtes en train d'ajouter la même objet à plusieurs reprises à la liste. Vous n'avez qu'un
MyObj
créé et vous modifiez uniquement la valeur int l'objet est la détention d'.OriginalL'auteur Fabian Barney
c'est parce que vous êtes à la garder juste une référence à MyObj et tous les éléments s'y reporter. essayez de modifier le code comme suit:
en outre, retirer l'ob1 définition en dehors de la boucle.
OriginalL'auteur aishwarya
Vous modifiez le même objet, à chaque fois, de sorte que la dernière fois dans votre boucle de mauvais jeu de ob1.iX = 4+5 (=9).
Vous devez créer une nouvelle instance à chaque fois, afin de les mettre dans ta boucle:
OriginalL'auteur Nathan Q
Encore une version à l'aide d'un tableau d'Objets:
OriginalL'auteur Mayur
vous ajoutez un objet à la liste , car c'est en donnant le même résultat.
vous devez créer une nouvelle instance à chaque fois. 🙂
OriginalL'auteur bhavesh