2017-10-17 17 views
0

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:

  1. Selon this après, nous pouvons dire que nous faisons une shallow copy de la carte de Hash.
  2. 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?

+2

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

+4

La copie superficielle ou profonde n'a pas d'importance ici: la carte ne contient que des valeurs immuables. –

+1

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

Répondre

-2

L'initialisation d'un hashmap à partir d'une autre carte n'entraînera pas de copie superficielle. Un nouvel objet de carte aura ses propres données et ainsi la suppression ou l'ajout d'entrées n'affectera pas les deux cartes. Cependant, les objets clé et valeur dans les deux cartes seront identiques et ainsi toute opération sur les objets clé et valeur sera visible à la fois à condition que ces objets ne soient pas immuables et ne soient pas des objets string

+1

Ce que vous décrivez est précisément la définition de Donc oui, le constructeur de copie crée une copie superficielle –

+0

Non @JBNizet Hashmap maintient en interne les datatables qui contiennent des clés et des objets de valeurs Les données ne sont pas copiées peu profondes –

+1

"Initialiser un hashmap d'une autre carte ne conduira pas à shallow Copier "Absolument faux Ne vous trompez pas en apportant ici la structure interne d'un' HashMap' (qui n'est pas appelé "datatable") – Kayaman