У объектов по умолчанию один и тот же адрес памяти - PullRequest
0 голосов
/ 29 декабря 2018

что означает это поведение?

var string1 = "hello"
var string2 = "hello"
println(string1 == string2) // return true
println(string1 === string2) // return true

, поскольку

равенство : определяет, содержат ли два объекта одно и то же состояние.(==)

identity : определяет, имеют ли два объекта один и тот же адрес памяти.(===)

они используют один и тот же адрес памяти?

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

Да, они имеют один и тот же адрес памяти.Если у нас уже есть «привет», новый «привет» не будет создан

var string2 = "hello"

Если вы создали новую строку с помощью конструктора

var string2 = String("hello")

, тогда

println(string1 === string2)

return false

Читать о пуле строк Java https://www.baeldung.com/java-string-pool

0 голосов
/ 29 декабря 2018

Я сделал несколько выводов для вашего хорошего вопроса.

Как и в Справочнике Котлина , примитивные типы обрабатываются одинаково в == и === в обоих.

Но для пользовательских объектов они работают по-другому.== сравнивает структуру и === проверяет ссылку.

    fun main(args: Array<String>) {
    val v1 = Temp("world")
    val v2 = Temp("world")

    println(v1 == v2)// true
    println(v1 === v2)// false
    }


    data class Temp(var val1: String)
0 голосов
/ 29 декабря 2018

Краткий ответ: ДА , они используют один и тот же адрес памяти.

Следующее описание применимо для Kotlin / JVM .Когда вы объявляете новую строку, за кулисами происходят некоторые интересные вещи.Это базовое объявление строки.Мы создаем новую строковую переменную с именем string1 и присваиваем ей значение:

var string1 = "hello"

Она будет выделять пространство в памяти для литерального значения привет .Эта область в памяти называется пул строковых констант .Это как пул строковых значений, которые доступны для других частей программы.Теперь, если вы создали другую переменную, скажем string2, и ТАКЖЕ присвоили ей значение привет Kotlin повторно использует значение, которое уже находится в пуле.Пул строковых констант находится внутри раздела памяти и называется heap .Это часть памяти, которая используется для операций во время выполнения, работы с классами и объектами.Думайте о куче, как о клочке садовой почвы, из которой вы можете легко взять грязь и растения, когда вы сажаете сад.Котлин размещает эти новые объекты там.Если вы создадите еще сотню объектов, Kotlin создаст еще сотню литералов поверх кучи.

Я бы использовал Ссылочное равенство (===) только для проверки того, что переменные указывают на одно и то жеобъект или нет.

...