Страницы

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

воскресенье, 29 декабря 2019 г.

Boxing in Java

#java


Добрый день. Читаю , про автоупаковку в Java и появился вопрос :
    Integer i0 = 100;
    Integer i1 = new Integer(100);
    System.out.println(i0 == i1);

Почему результат false ? Ведь , если сделать так :
    Integer i0 = 100;
    Integer i1 = 100;
    System.out.println(i0 == i1);

То результат будет true. Хотя в первом примере строка :
    Integer i1 = new Integer(100);

Где значение 100 тоже упаковывается, но только вручную, а не автоматически (как во
втором примере) в объект типа Integer.     


Ответы

Ответ 1



Такой код Integer i0 = 100; эквивалентент такому: Integer i0 = Integer.valueOf(100); Если взглянуть на реализацию метода valueOf, то можно увидеть, что для значений от -128 до 127 используется кэш объектов типа Integer. См. так же документацию метода valueOf. При вызове же конструктора кэш не используется и создается новый экземпляр класса Integer.

Ответ 2



Ну первый пример почему false это понятно, поскольку сравниваются ссылки на разные объекты. Во втором случае, по идее должно было бы быть тоже false, но проблема в том, что автобоксируемые объекты кэшируются и при втором вызове i1=100 будет возвращен ранее созданный при i0=100 объект, поэтому сравнение и возвращает true В общем такие вещи делать с автобоксингом не рекомендуется. Автобоксинг был придуман не для этого.

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

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