#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 В общем такие вещи делать с автобоксингом не рекомендуется. Автобоксинг был придуман не для этого.
Комментариев нет:
Отправить комментарий