Что не 2 Длинные переменные равны с оператором == для сравнения в Java?
У меня возникла очень странная проблема, когда я пытаюсь сравнить две длинные переменные, они всегда показывают false, и я уверен, что они имеют одинаковое числовое значение, отлаживая в Eclipse:
if (user.getId() == admin.getId()) {
return true; // Always enter here
} else {
return false;
}
Оба из двух возвращаемых значений являются объектными типами Long, которые меня смутили. И чтобы убедиться, что я написал основной метод следующим образом:
Long id1 = 123L;
Long id2 = 123L;
System.out.println(id1 == id2);
Он печатает true.
Так может кто-нибудь дать мне идеи?. Я работаю в Java Development в течение 3 лет, но не могу объяснить этот случай.
Ответы
Ответ 1
==
сравнивает ссылки, .equals()
сравнивает значения. Эти два типа Long являются объектами, поэтому ссылки на объекты сравниваются при использовании оператора ==
.
Однако учтите, что в Long id1 = 123L;
Литеральное значение 123L
будет автоматически упаковано в объект Long
с использованием Long.valueOf(String)
, и внутренне этот процесс будет использовать LongCache с диапазоном [-128,127]
, и 123 находится в этом диапазоне, что означает, что длинный объект кэшируется, и эти два на самом деле являются одинаковыми объектами.
Ответ 2
потому что ==
сравнивает опорное значение, и меньший длинные значения кэшируются
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
поэтому он работает для меньших длинных значений
Также см.
Ответ 3
Застрял в проблеме в течение 4 часов из-за использования ==
... Сравнение было в порядке Long < 128
, но ko при больших значениях.
Как правило, не рекомендуется использовать ==
для сравнения Objects
, используйте .equals()
как можно больше! Держите ==, >, <, <= etc.
для примитивов.