2012-01-12 2 views
-1

Я был ошеломлен, узнав, что сравнение двух логических объектов с == может получить неправильный ответ.Сравнение Java Boolean class

Посмотрите на тестовый код для кода. Тест a и тест c дают согласованные ответы.

Тест b не работает. Кажется, что новый Boolean (true) может создать отдельный объект с тем же значением, вместо того, чтобы возвращать ссылку на Boolean.TRUE;

public static void main(String[] args) { 
    Boolean a = Boolean.TRUE; 
    Boolean b = new Boolean(true); 
    Boolean c = null; 
    boolean x = true; 
    boolean y = false; 

    System.out.println("Test a"); 
    System.out.println((a == Boolean.TRUE) ? "TRUE" : "FALSE"); 
    System.out.println((Boolean.TRUE.equals(a)) ? "TRUE" : "FALSE"); 
    System.out.println("Test b"); 
    System.out.println((b == Boolean.TRUE) ? "TRUE" : "FALSE"); 
    System.out.println((Boolean.TRUE.equals(b)) ? "TRUE" : "FALSE"); 
    System.out.println("Test c"); 
    System.out.println((c == Boolean.TRUE) ? "TRUE" : "FALSE"); 
    System.out.println((Boolean.TRUE.equals(c)) ? "TRUE" : "FALSE"); 

    /* OUTPUT is 
    Test a 
    TRUE 
    TRUE 
    Test b 
    FALSE 
    TRUE 
    Test c 
    FALSE 
    FALSE   
    */ 
} 
+2

В чем вопрос? Так работает Java, нравится это или нет. – skaffman

+1

Это правда ... так в чем вопрос? –

+0

Возможно, изучите, почему вы думаете, что вызов конструктора собирается что-то вернуть вам. Вернее, если вы должны написать параметризованный конструктор для 'Boolean', как вы думаете, вы бы его записали, чтобы вернуть' Boolean.TRUE'? –

ответ

7

Поскольку Boolean тип ссылки и == тесты, если они и тот же объект в памяти, то вы получите ложь, потому что вы выделили b с new.

Смежные вопросы