Kotlin: Почему val b (Map) изменяется во время итерации, даже если действия происходят над другим var a в цикле do-while?

Почему такой код встречается только на одной итерации? Почему "b" изменяется одновременно с "a" после присваивания до конца итерации?

Я сделал аналогичный код, где (a) и (b) - целые числа, тогда (b) не изменяется до следующей итерации. Почему по-другому ведет себя с картой?

var a = mutableMapOf("z" to 1)

do {
    val b = a
    a["x"] = 2
    // why here b == a in the first iteration?
} while (a != b)

1 ответ

Решение

Согласно комментарию @jsamol, в нем говорится: "Подобно Java, Kotlin никогда неявно копирует объекты при назначении. Переменные всегда содержат ссылки на объекты, а присвоение выражения переменной копирует только ссылку на объект, а не сам объект".

Я изменил условие, чтобы сравнивать целые числа, а не карты. Как это устроено.

var a = mutableMapOf("z" to 1)

do {
    val b = a.size
    a["x"] = 2
} while (a.size != b)
Другие вопросы по тегам