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
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
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?
3 Réponses :
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)
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.
Est-ce que kotlin passe la référence de la variable List_A à List_B?
Exactement.
List_A
etList_B
font référence à la même adresse en mémoire. Si vous voulez faire une copie, vous devez créer une nouvelleArrayList
et y ajouter tous les éléments avecaddAll
. Après cela, vous pouvez effacerList_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 paslistA
et n'en changez pas un élément, cet élément sera également modifié danslistB
en conséquence.
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 ..
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:
listA
peut être déduit, il n'est donc pas nécessaire de spécifier le type explicitement.