#java #integer
На этот вопрос уже дан ответ здесь:
Как работает оператор проверки на равенство (оператор ==)
(1 ответ)
Закрыт 1 год назад.
Наткнулся на очень интересный пример:
Integer a1 = 127;
Integer a2 = 127;
Integer a3 = 128;
Integer a4 = 128;
System.out.println(a1 == a2); //true
System.out.println(a3 == a4); //false
Почему?
Ответы
Ответ 1
Данные от -128 до 127 находятся в кеше и, при инициализации таким способом, новый объект не создается. Внутри Integer есть private class IntegerCache, там в javadoc можно почитать поподробнее.Ответ 2
Согласно документации Integer данные от -128 до 127 (включительно) кешируются для Integer, т.е. для этих значений будет возвращена одна и та же ссылка на объект, поэтому сравнение как == работало, т.к. оно для объектов проверяет не равенство значения, а равенство ссылок. Если поискать, то можно найти реализацию метода, который и выполняет то кеширование: public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } В том же классе Integer можно найти реализацию внутреннего приватного класса IntegerCache, в котором задаются границы кеширования.
Комментариев нет:
Отправить комментарий