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_AetList_Bfont référence à la même adresse en mémoire. Si vous voulez faire une copie, vous devez créer une nouvelleArrayListet 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
Stringdans 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 paslistAet n'en changez pas un élément, cet élément sera également modifié danslistBen 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.