2015-02-20 14 views
3

Быстрый вопрос: гарантировано ли, что этот код всегда печатает true?Равенство в штучной упаковке boolean

Boolean b1 = true; 
Boolean b2 = true; 
System.out.println(b1 == b2); 

бокса логических значений, кажется, приводит к тому же булеву объекту все время, но я не мог найти слишком много информации о коробочном булевом равенстве в JLS. Напротив, даже кажется, что предполагается, что бокс должен создавать новые объекты и может даже приводить к исключениям OOM.

Что вы думаете?

+1

'new Boolean (true)' не будет равным другим буферам в боксе. –

ответ

9

С Java Language Specification on Boxing Conversion

боксом преобразования преобразует выражения примитивного типа к соответствующим выражениям типа ссылки. В частности, следующие девять преобразования называются преобразования бокс:

  • От типа boolean к типу Boolean

[...]

Если значение p быть в штучной упаковке является целочисленный литерал типа int между -128 и 127 включительно (§3.10.1) или boolean буквального true или false (§3.10.3), или литеру между '\u0000' и '\u007f' включительно (§3.10.4), то пусть a и b быть результатами любых два бокса превращений p. Это всегда так, что a == b.

Это относительно просто implemented, как

/** 
* The {@code Boolean} object corresponding to the primitive 
* value {@code true}. 
*/ 
public static final Boolean TRUE = new Boolean(true); 

/** 
* The {@code Boolean} object corresponding to the primitive 
* value {@code false}. 
*/ 
public static final Boolean FALSE = new Boolean(false); 

public static Boolean valueOf(boolean b) { 
    return (b ? TRUE : FALSE); 
} 
+0

thnx, пропустил эту часть –

+0

, но я думаю, что это не гарантировано, что 'Boolean.TRUE == true' правильно? –

+2

@OlegMikheev Да, это, см. [JLS 15.21.2] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.21.2). В этом случае 'Boolean.TRUE' распаковывается в' true', поэтому вы получаете 'true == true'. – Jesper

2

Да. Компилятор автоматически переводит это:

Boolean b1 = true; 

в этом:

Boolean b1 = Boolean.valueOf(true); 

, который всегда возвращает один из двух констант Boolean.TRUE или Boolean.FALSE.