Почему сравнения Integer.valueOf (...) в этом примере возвращают разные значения? - PullRequest
2 голосов
/ 09 марта 2011

Из ответа на вопрос о примитивных типах и автобоксе в java :

для бизиклопа:

Бизиклоп класса {

public static void main(String[] args) {
    System.out.println(new Integer(5) == new Integer(5));
    System.out.println(new Integer(500) == new Integer(500));

    System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
    System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
}

}

Результаты:

C:\Documents and Settings\glow\My Documents>java biziclop
false
false
true
false

C:\Documents and Settings\glow\My Documents>

Почему это?

Ответы [ 4 ]

3 голосов
/ 09 марта 2011

См. Integer.valueOf реализации: http://docjar.com/html/api/java/lang/Integer.java.html (строка 850 с)

3 голосов
/ 09 марта 2011

Integer.valueof кэширует объекты для значений, близких к нулю, как того требует спецификация языка Java.

Вдохновлен ответом Илья см. последний, фактический источник для Integer.valueOf () в следующем JDK7, строки 638-643.

1 голос
/ 09 марта 2011

Integer.valueOf кэширует значения, в частности, от -128 до 127.

1 голос
/ 09 марта 2011

Вы должны использовать метод равенства, а не оператор ==. == проверить, равны ли два объекта, но вы создаете разные объекты с одинаковым значением и вам нужен метод equal() для сравнения значений объекта.

Обновление:
Причина различного поведения Integer.valouOf(5) и Integer.valouOf(500) заключается в том, что реализация Integer использует статическое значениеOFCache размером -128..127.
Начиная с Java 7 это настраивается с помощью аргумента командной строки -XX:AutoBoxCacheMax=<size>

...