1
votes

Le tableau mutable est remplacé lorsqu'il est asserté à une autre variable

J'ai un cas simple où j'ai "Liste A" avec 5 valeurs et une autre "Liste B" agit comme TempList contenant des valeurs "Liste A" maintenant quand j'appelle "list_A.clear ()"
"list_B" est également effacé pourquoi?

List_A-----Size--------> 0
List_B-----Size--------> 5

Résultat

var List_B: MutableList<String> = ArrayList<String>()
  then
List_B.addAll(List_A) 

Veuillez noter que cela fonctionne comme prévu lorsque je définis "List_B" comme

List_A-----Size--------> 0
List_B-----Size--------> 0

Résultat

val List_A: MutableList<String> = ArrayList<String>()


List_A.add("index_1")
List_A.add("index_2")
List_A.add("index_3")
List_A.add("index_4")
List_A.add("index_5")

val  List_B = List_A
List_A.clear()

Est-ce que kotlin passe la référence de la variable List_A à List_B?


0 commentaires

3 Réponses :


2
votes

Lorsque vous créez un objet et que vous attribuez une référence à cet objet à List_A , une mémoire est allouée à cet objet et il a une adresse, par exemple @ eae072e . List_A est une référence à cet objet. Lorsque vous créez une variable List_B et que vous lui attribuez List_A , elles renvoient toutes les deux à la même adresse en mémoire @ eae072e . Ainsi, lorsque vous utilisez l'un d'eux pour manipuler des données, cette manipulation sera reflétée dans les deux - dans List_A et List_B .

Pour éviter une nouvelle instance de List_B doit être créé:

List_A.clear() 
// List_A is empty, List_B will contain items

Ensuite, vous pouvez effacer la liste List_A et cela ne sera pas reflété dans List_B :

var List_B: MutableList<String> = ArrayList<String>()
List_B.addAll(List_A) 


2 commentaires

Selon ta réponse si je comprends bien la "pile mémoire" peut avoir la même adresse deux fois merci ...


Deux variables peuvent faire référence à la même adresse en mémoire.



2
votes

Est-ce que kotlin passe la référence de la variable List_A à List_B?

Exactement. List_A et List_B font référence à la même adresse en mémoire. Si vous voulez faire une copie, vous devez créer une nouvelle ArrayList et y ajouter tous les éléments avec addAll . Après cela, vous pouvez effacer List_A .

Example

val listA: MutableList<String> = mutableListOf("index_0", "index_1", "index_2")
val listB: MutableList<String> = mutableListOf()
listB.addAll(listA)
listA.clear()

Bien que cela fonctionne avec String dans votre cas, vous devez comprendre que la nouvelle liste contient les mêmes objets (référence aux mêmes objets), pas une copie d'entre eux. Donc, si vous n'effacez pas listA et n'en changez pas un élément, cet élément sera également modifié dans listB en conséquence.


1 commentaires

ne pas Kotlin Pass variable Par valeur Comme Java car il utilise la même JVM et pourquoi déclarer List_B ne crée pas d'adresse en mémoire merci pour votre réponse ..



2
votes

listA et listB contiennent tous deux la même référence au moment où vous appelez clear () .

Ce que vous devez faire est de faire une copie de listA en appelant toMutableList().

val listA = ArrayList<String>()

listA.add("index_1")
listA.add("index_2")
// ...

val listB = listA.toMutableList()
listA.clear()
// listB will be unchangend

Remarque:

  • Vous devez vous en tenir aux conventions de dénomination de Kotlin, vos variables doivent donc être en cas de chameau sans trait de soulignement.
  • Le type de listA peut être déduit, il n'est donc pas nécessaire de spécifier le type explicitement.


0 commentaires