Changer de valeur une fois qu'elle est placée dans HashMap change qu'est-ce qu'il y a dans HashMap?
si je crée un nouveau HashMap et une nouvelle liste, puis place la liste à l'intérieur du Hashmap avec une touche arbitraire et ensuite appelle List.clear()
est-ce que cela affectera ce que j'ai placé dans le HashMap?
la question plus profonde ici étant: quand j'ajoute quelque chose à un HashMap, est-ce qu'un nouvel objet est copié et placé ou est-ce qu'une référence à l'objet original est placée?
Merci!
8 réponses
ce qui se passe ici est que vous placez un pointeur vers une liste dans le hashmap, pas la liste elle-même.
quand vous définissez
List<SomeType> list;
vous définissez un pointeur vers une Liste, pas une liste elle-même.
Lorsque vous faites
map.put(somekey, list);
vous stockez juste une copie du pointeur, pas la liste.
si, ailleurs, vous suivez ce pointeur et modifiez l'objet à sa fin, n'importe qui tenant ce pointeur sera toujours référence à la même, objet modifié.
consultez http://javadude.com/articles/passbyvalue.htm pour plus de détails sur le laisser-passer-par-valeur en Java.
Java est passé par référence par la valeur.
ajouter la liste à la carte de hachage ajoute simplement la référence à la carte de hachage, qui pointe vers la même Liste. Par conséquent, effacer la liste directement effacera en effet la liste que vous référencez dans le hashmap.
quand j'ajoute quelque chose à un HashMap, est un nouvel objet copié et placé ou est un référence à l'objet d'origine placé?
C'est toujours une référence à l'objet. Si vous effacez le HashMap, l'objet sera toujours "live". Ensuite, l'objet sera détruit par le garbage collector si personne n'est référençant plus. Si vous avez besoin de le copier, jetez un oeil à Object.la méthode clone () et à l'interface clonable
en général, vous utilisez toujours des références en Java (à moins que vous ne créiez vous-même explicitement un nouvel objet avec "new" [1]).
par conséquent, il s'agit d'une référence et non d'une copie complète de l'objet que vous avez stockée dans la carte, et changer la liste aura aussi un effet sur ce que vous voyez en parcourant la carte.
C'est une fonction, pas un bug :)
[1] les puritains incluront "clone()" et la sérialisation, mais pour la plupart du code java "new" est la façon d'obtenir des objets.
Essayer
package test32; import java.util.ArrayList; import java.util.HashMap; import java.util.List; class Foo { public Foo(int id, String name) { this.id=id; this.name=name; } public static void main(String[] args) { HashMap strs = new HashMap(); // create a list of objects List ls = new ArrayList(); ls.add(new Foo(1, "Stavros")); ls.add(new Foo(2, "Makis")); ls.add(new Foo(3, "Teo")); ls.add(new Foo(4, "Jim")); // copy references of objects from list to hashmap strs.put("1", ls.get(0)); strs.put("2", ls.get(1)); strs.put("3", ls.get(2)); strs.put("4", ls.get(3)); System.out.println("list before change : " + ls); System.out.println("map before change: " + strs); // get an object from the hashmap Foo f=strs.get("1"); // set a different value f.setId(5); // observe that the differences are reflected to the list and to the hashmap also System.out.println("list after change : "+ls); System.out.println("map after change: "+strs); } private int id; public void setId(int id) { this.id=id; } public int getId() { return this.id; } private String name; public void setName(String name) { this.name=name; } public String getName() { return this.name; } public String toString() { StringBuilder sb = new StringBuilder(); sb.append(id); sb.append("-"); sb.append(name); return sb.toString(); } }
la bonne réponse est expliquée ci-dessous : Supposons que vous ayez une HashMap appelée hashmap et que vous mettez initialement une paire de valeurs clés dans cette HashMap par exemple hashmap<"test1","test2">. Après cela, lorsque vous passez cette hashmap à une fonction où vous changez de nouveau sa valeur à test3 comme hashmap.put("test1", "test3") et d'imprimer la carte à nouveau dans la Méthode main, la Java de Passer par la Notion de Valeur échoue ici.
La Raison en est : Lorsque vous utilisez HashMap, il fait le hachage pour la clé (test1) et stocker la valeur. Quand vous l'avez passé à la fonction où il change de nouveau sa valeur, il fait de nouveau le hachage pour la même clé et obtient la même adresse mémoire et change la valeur en conséquence. C'est pourquoi lorsque vous essayez de retirer la touche "test1" elle vous donne le résultat comme "test3"
Map<Integer, Integer> hasmapA = new HashMap<>();
hasmapA.put("key1", "value1");
hasmapA.put("key2", "value2");
hasmapA.put("key3", "value3");
Copier Par la référence: si vous en assignez un HashMap pour les autres alors à la fois le point de référence dans la mémoire.
Map hasmapB;
hashmapB = hashmapA;
Si vous apportez des modifications dans l'un de ces changements reflètent dans les deux HashMap comme les deux font référence au même endroit.
- Copie Par Valeur: Si vous wan pour
clone/propriétédeepcopy/créer un mémoire distinct emplacement/créer un objet distinct
de hashmapB lors de la copie du contenu de hashmapA
Map<Integer, Integer> hashmapB = new HashMap<>();;
hashmapB.putAll(hashmapA)
Note: ** Avez-vous remarqué une différence dans les deux points pour la déclaration hashmapB? Dans le deuxième point nous devons appeler * * HashMap constructeur. Afin que nous puissions putAll données de hashmapA dans hashmapB.
Geeze personnes...tout en Java est passé par la valeur. Lorsque vous passez un objet, la valeur que vous passez est la référence de l'objet. Plus précisément, vous transmettez une copie de la référence de l'objet. Il n'y a pas non plus de pointeurs en Java, bien que les références soient similaires. Obtenir la droite!