Сравнение типов 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.
Мои вопросы:
- Не срабатывается ли в этом случае Autoboxing и unboxing?
- Я не очень понимаю, почему отрабатывают правильно условия больше/меньше? ведь если мы сравниваем адреса объектов, не их значения, то результат можно получить какой угодно.
- И почему сравнение символов 'а' дает нам равенство, а символов 'ы' не проходит ни одно из условий?
P.S. UPDATE
- По поводу условия на равенство - я думаю причина в том, что срабатывает кэширование значений в типе Character. Но только для символа 'а', следовательно в этом случае мы имеем ссылку на один элемент.
- В условиях больше/меньше видимо происходит unboxing значений.
Ответы (1 шт):
При применении операций сравнения происходит 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:
- If any operand is of a reference type, it is subjected to unboxing conversion
- ...
Соответственно, сначала, при передаче параметров происходит автобоксинг (char -> Character), далее во время сравнения, объекты Character -> char и уже сравниваются char vs. char
Поскольку char является примитивным типом сравниваются уже их порядковые номера в Unicode таблице.