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!

32
demandé sur Diego 2009-06-01 17:15:56

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.

42
répondu Scott Stanchfield 2009-06-01 13:39:32

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.

10
répondu James Camfield 2009-06-01 13:18:02

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

3
répondu daitangio 2009-06-01 14:26:42

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.

1
répondu Thorbjørn Ravn Andersen 2009-06-01 14:26:43

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();
    }
}
1
répondu stavros 2010-04-28 09:45:24

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"

1
répondu Shashank Agrawal 2013-07-15 16:44:40
Map<Integer, Integer> hasmapA = new HashMap<>();
hasmapA.put("key1", "value1");
hasmapA.put("key2", "value2");
hasmapA.put("key3", "value3");
  1. 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.

  1. 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.

Référence

1
répondu Taimoor Changaiz 2015-06-16 05:18:43

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!

-2
répondu GreenieMeanie 2009-06-01 13:53:32