#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, в котором задаются границы кеширования.
Комментариев нет:
Отправить комментарий