Сравнение типов Character в Java больше, меньше, равно

Есть вот такой код:

public class Solution {
    public static void main(String[] args) {
        compare('a', 'a');
        compare('a', 'б');
        compare('р', 'в');
        compare('ы', 'ы');
    }

    public static void compare(Character first, Character second) {
        if (first == second) {
            System.out.println("равны");
        } else if (first > second) {
            System.out.println("больше");
        } else if (first < second) {
            System.out.println("меньше");
        } else {
            System.out.println("А как такое может быть???");
        }
    }
}

Когда мы сравниваем объекты, в таких условиях по-идеи сравниваются их адреса, но я не уверен в случае с классом Character.

Мои вопросы:

  1. Не срабатывается ли в этом случае Autoboxing и unboxing?
  2. Я не очень понимаю, почему отрабатывают правильно условия больше/меньше? ведь если мы сравниваем адреса объектов, не их значения, то результат можно получить какой угодно.
  3. И почему сравнение символов 'а' дает нам равенство, а символов 'ы' не проходит ни одно из условий?

P.S. UPDATE

  1. По поводу условия на равенство - я думаю причина в том, что срабатывает кэширование значений в типе Character. Но только для символа 'а', следовательно в этом случае мы имеем ссылку на один элемент.
  2. В условиях больше/меньше видимо происходит unboxing значений.

Ответы (1 шт):

Автор решения: Barmaley

При применении операций сравнения происходит unboxing. Согласно спецификации Java:

When an operator applies binary numeric promotion to a pair of operands, each of which must denote a value that is convertible to a numeric type, the following rules apply, in order:

  1. If any operand is of a reference type, it is subjected to unboxing conversion
  2. ...

Соответственно, сначала, при передаче параметров происходит автобоксинг (char -> Character), далее во время сравнения, объекты Character -> char и уже сравниваются char vs. char

Поскольку char является примитивным типом сравниваются уже их порядковые номера в Unicode таблице.

→ Ссылка