Что не 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. для примитивов.