Примитив == оболочка преобразуется в примитив == примитив или оболочка == оболочка?
Я предполагаю, что преобразования, описанные в jls, сортируются в соответствии с приоритетом. Первый имеет большой приоритет.
Таким образом, я решил, что Boxing
имеет больший приоритет, чем Unboxing
, Я решил проверить это предположение.
исследовать следующий код:
public class BoxingUnboxingPriority {
public static void main(String [] args){
int sn = 1000;
Integer isn1= new Integer(sn);
System.out.println(sn == isn1 );
}
}
из:
true
Что такое бокс? просто new Integer(primitiveInt)
Я немного поменял код
int sn = 1000;
Integer isn1= new Integer(sn);
Integer isn2= new Integer(sn);
System.out.println(isn1 == isn2 );
из:
false
Таким образом, я сделал ошибку.
Пожалуйста, уточните мне этот вопрос.
4 ответа
Я предполагаю, что преобразования, описанные в jls, сортируются в соответствии с приоритетом.
Это неверно. JLS не говорит о "приоритетах" для конверсий. Это не признанная концепция.
Фактически, преобразования, которые могут быть применены, документируются в каждом конкретном случае для каждого оператора и так далее. Таким образом, JLS 15.21.1 говорит, что ==
или же !=
для числовых типов приводит к "двоичному числовому продвижению" обоих операндов. А в JLS 5.6.2 говорится, что двоичное числовое продвижение состоит из "преобразования без распаковки" ( 5.1.8), за которым следует "расширение примитивного преобразования" ( 5.1.2) и, наконец, "преобразование набора значений" ( 5.1.3).
В отличие от этого, JLS 15.21.3 говорит, что при сравнении двух ссылок используется ==
или же !=
, никаких рекламных акций или конверсий не происходит.
(На самом деле, распространенной ошибкой начинающих Java является использование ==
сравнить два Integer
объекты, а не equals(Object)
метод. И, вероятно, именно этот "вопрос", на который вы смотрите, пытается проверить ваше понимание...)
15.21.1. Операторы числового равенства == и!=
Если оба операнда оператора равенства имеют числовой тип или один имеет числовой тип, а другой преобразуется ( §5.1.8) в числовой тип, двоичные числовые преобразования выполняются над операндами ( §5.6.2).
Так:
Integer o = 1;
int i = 1;
boolean b = o == i;
...эквивалентно:
boolean b = o.intValue() == i;
Там, где оба имеют тип Integer, ни один из них не является простым числовым типом - они оба являются объектными ссылками.
Когда вы используете примитив с объектом Wrapper, этот объект-оболочка будет распакован, а затем будет применена операция.
В вашем первом случае, когда вы сравниваете sn
с isn1
, isn1
будет распакован и значение будет сопоставлено. Итак, вы получили true
,
Во втором случае isn1
, isn2
два разных объекта, так ==
оператор даст false
int sn=1000;
Integer isn1=new Integer(sn);
System.out.println(sn == isn1 );
будет преобразован в
System.out.println(sn == isn1.intValue());
при сравнении примитива с оболочкой объект-оболочка сначала будет распакован, а затем сравнен. Объект-обертка intValue() возвращает int, так что результат примитивного сравнения true.
Integer isn1= new Integer(sn);
Integer isn2= new Integer(sn);
System.out.println(isn1 == isn2 );
// сравниваем два разных объекта так ложно.