Scala интернирование: как различная инициализация влияет на сравнение? - PullRequest
3 голосов
/ 08 мая 2020

Я новичок в Scala, но знаю Java. Таким образом, насколько я понимаю, разница в том, что == в Scala действует как .equals в Java, что означает, что мы ищем значение; и eq в Scala действует как == в Java, что означает, что мы ищем ссылочный адрес, а не значение.

Однако после выполнения кода ниже:

    val greet_one_v1 = "Hello"
    val greet_two_v1 = "Hello"
    println(
            (greet_one_v1 == greet_two_v1),
            (greet_one_v1 eq greet_two_v1)
    )


    val greet_one_v2 = new String("Hello")
    val greet_two_v2 = new String("Hello")
    println(
            (greet_one_v2 == greet_two_v2),
            (greet_one_v2 eq greet_two_v2)
    )

Я получаю следующий результат:

(true,true)
(true,false)

Моя теория состоит в том, что инициализация этих строк отличается. Следовательно, чем val greet_one_v1 = "Hello" отличается от val greet_one_v2 = new String("Hello")? Или, если моя теория неверна, почему у меня разные результаты?

1 Ответ

0 голосов
/ 29 мая 2020

Как правильно ответил Луис Мигель Мехиа Суарес, ответ заключается в String Interning , который является частью того, что JVM (Java Virtual Machine) делает автоматически. Чтобы инициировать новую строку, ее нужно инициировать явно, как в моем примере выше; в противном случае Java будет выделять ту же память для тех же значений в целях оптимизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...