Kotlin ведет себя странно в идентичности номеров в штучной упаковке и без коробки - PullRequest
0 голосов
/ 30 января 2019

В моем алгоритме я проверял идентификацию переменной int и обнуляемого int,

var literal_num: Int = 1000

var literal_num_boxed: Int? = literal_num

println("***********************************")

println((literal_num === literal_num_boxed)) //print false

println("***********************************")

, но когда вы меняете число на 100, идентичность становится равной, я здесь не так делаю?

var literal_num: Int = 100

var literal_num_boxed: Int? = literal_num

println("***********************************")

println((literal_num === literal_num_boxed)) //true

println("***********************************")

Я попробовал то же самое в документации по kotlin.его также ведет себя так же.проверьте следующие изображения.


enter image description here


После того, как я отредактировал число до 100, оно ведет себя по-другому.


enter image description here


1 Ответ

0 голосов
/ 30 января 2019

Это связано с тем, что Integer.valueOf имеет кэши.

Когда вы используете === для сравнения int и Int?, Происходит автоматическая блокировка, и она вызывает Integer.valueOf.

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

FromInteger.java.low - это -128, а high по умолчанию - 127.

Когда происходит автоматическая коробка, каждое число от -128 до 127 будет иметь одинаковые Integer, и ваш результат будет верным.Если число не входит в этот диапазон, будет создан новый Integer и ваш результат будет ложным.

Связанные шаблоны проектирования: https://java -design-patterns.com / Patterns /наилегчайшем /

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