Когда вы делаете ==
, вы сравниваете ссылки на равенство.Это означает, что вы говорите: «Адрес в памяти одинаков для обоих объектов?»
Когда вы делаете .equals()
, вы сравниваете сами объекты на равенство.Это означает, что вы говорите «эти два объекта считают себя равными?»
Приведенный пример был плохим. Единственное кэширование, выполняемое для этих чисел, предписанное JLS, - это метод .valueOf()
. Конструктор не кэшируется.
Кроме того, JLS указывает только минимум вы должны кэшировать [-128: 127].Реализации JVM могут кэшировать больше, если они того пожелают.Это означает, что Integer.valueOf(500) == Integer.valueOf(500)
может быть false
на некоторых машинах, но true
на других.
class biziclop {
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>
Более подробный ответ здесь (комментарии - это жемчужина!): Почему люди все еще используют примитивные типы в Java?