Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Как происходит сравнение ссылок у Integer? [дубликат]

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

Комментариев нет:

Отправить комментарий