Как Java сравнивает две переменные-оболочки? - PullRequest
2 голосов
/ 17 декабря 2011

У меня есть две переменные, которые нужно сравнить:

Double a = 1D;
Double b = 2D;

if (a > b) {
    System.out.print("Ok");
}

В этом случае java будет использовать автобокс или сравнивать две ссылки на объекты?

Ответы [ 2 ]

5 голосов
/ 17 декабря 2011

С раздел 15.20.1 JLS :

Тип каждого из операндов оператора числового сравнения должен быть типом, который можно преобразовать (§5.1.8) в примитивный числовой тип, иначе произойдет ошибка времени компиляции. Двоичное числовое продвижение выполняется над операндами (§5.6.2). Если повышенный тип операндов - int или long, то выполняется сравнение целых чисел со знаком; если этот повышенный тип является float или double, то выполняется сравнение с плавающей запятой.

Раздел 5.6.2 начинается с:

Когда оператор применяет двоичное числовое продвижение к паре операндов, каждый из которых должен обозначать значение, которое может быть преобразовано в числовой тип, применяются следующие правила в порядке использования расширяющегося преобразования (§5.1.2) для преобразования операнды по мере необходимости:

  • Если какой-либо из операндов относится к ссылочному типу, выполняется преобразование без распаковки (§5.1.8).

Так что да, распаковка выполняется. > не имеет значения для самих ссылок.

Более интересен случай ==, когда возможны оба варианта - и в этом случае, если операнд или является примитивом, а другой можно преобразовать с помощью числового продвижения , тогда это происходит ... но если оба являются ссылочными типами, выполняется сравнение ссылок. Например:

Double d1 = new Double(1.0);
Double d2 = new Double(1.0);       
System.out.println(d1 == d2); // Prints false due to reference comparison
0 голосов
/ 17 декабря 2011

Будет использоваться автобокс. Вы не можете сделать больше, чем по ссылкам

...