В чем причина такого странного поведения Java?

Я хотел проверить оператор '==' на Longs, и вот что я нашел :следующий код:

public static void main(final String[] args) {
    final Long n = 0L;
    final Long m = 0L;
    System.out.println(n + " == " + m + " : " + (n == m));

    final Long a = 127L;
    final Long b = 127L;
    System.out.println(a + " == " + b + " : " + (a == b));

    final Long A = 128L;
    final Long B = 128L;
    System.out.println(A + " == " + B + " : " + (A == B));

    final Long x = -128L;
    final Long y = -128L;
    System.out.println(x + " == " + y + " : " + (x == y));

    final Long X = -129L;
    final Long Y = -129L;
    System.out.println(X + " == " + Y + " : " + (X == Y));
}

выходы:

0 == 0 : true
127 == 127 : true
128 == 128 : false
-128 == -128 : true
-129 == -129 : false

Единственное объяснение, которое я смог придумать, заключалось в том, что JVM хранит все значения longвнутри [-128, 127]в пространстве Perm и дает их адреса Longs, а всему, что находится за пределами указанного выше диапазона, создает новое выделение для каждого статическое значение, встречающееся в коде.

Я близок к тому, чтобы быть правым? В каких ситуациях мы должны осознавать подобное поведение?

PS. Я знаю, что должен использовать проверку null, а затем .equals()для сравнения объектов, но мне было любопытно, знает ли кто-нибудь ответ.

РЕДАКТИРОВАТЬ

После ответа jtahlborn , который дал мне ключевое слово авто -бокс , я нашел эту замечательную статью схорошо -задокументированный ответ

6
задан Duncan Jones 10 November 2013 в 07:54
поделиться