Tenez compte, que j'ai une fonction de pilote foo()
qui est défini comme suit:Champ de copie peu profonde
void foo()
{
Map<Integer,Character> map = new HashMap<Integer,Character>() ;
bar(map)
//operations on map
}
void bar(Map<Integer,Character> map)
{
Map<Integer,Character> map2 = new HashMap<Integer,Character>(map) ;
//operations over map2
}
Maintenant, d'après ce que je sais, les opérations sur map2
devraient changer le map
d'origine, et par conséquent les opérations sur map
à l'intérieur foo()
serait sur une version différente de map
que l'original. raison de ma croyance:
- Selon this après, nous pouvons dire que nous faisons une shallow copy de la carte de Hash.
- Dans this la documentation, dans laquelle il est dit clairement que:
paramètres de type de données de référence, tels que les objets, sont également passés en méthodes de valeur. Cela signifie que lorsque la méthode renvoie, la référence passée fait toujours référence au même objet que précédemment. Cependant, les valeurs des champs de l'objet peuvent être modifiées dans la méthode , si elles ont le niveau d'accès approprié.
Par conséquent, puisque nous faisons une copie peu profonde, les opérations sur la copie en fin de compte changer la carte passé, et tous les changements sur cette carte sont passés sur la carte reflète d'origine, en raison de point 2.
Mais j'ai un exemple contradictoire qui remet en question ma compréhension. Alors, est-ce que ma pensée est correcte? Ou y a-t-il autre chose?
Je ne vous suis vraiment pas. copie signifie la même chose qu'en anglais. Si vous faites une copie d'un document et que vous modifiez la copie, le document d'origine reste inchangé. C'est tout l'intérêt d'une copie. Donc non, les changements à map2 ne feront aucun changement à la carte. Vous pourriez expérimenter et tester facilement, BTW. –
La copie superficielle ou profonde n'a pas d'importance ici: la carte ne contient que des valeurs immuables. –
Définissez ce que vous entendez par "modifier la carte transmise" Si vous voulez dire son ensemble de valeurs/clés, alors elles ne changeront pas pour "map2" lorsque vous ajoutez ou supprimez une clé de 'map'. état des objets clé ou valeur lorsque vous changez d'état (via des méthodes set par exemple), alors ils seront reflétés dans les deux maps car les deux maps référenceront les mêmes objets key/value – tsolakp