2012-06-17 27 views
20

Quindi ho sentito che se ho confrontato 2 stringhe con ==, otterrò solo true se entrambi si riferiscono allo stesso oggetto/istanza. Sono corde. Che dire di Booleans?== verifica la piena uguaglianza in Booleani? - Java

+4

Come potrebbero le corde si riferiscono alla stessa istanza e non essere identici? – Pablo

+0

No, ciò che intendo è se sono identici ma * non * si riferiscono alla stessa istanza, == restituisce false. – Bluefire

+0

Si prega di leggere qualsiasi cosa prima di postare, e non iniziare con ho sentito qualcosa da qualche parte. – stanwise

risposta

36

== verifica l'uguaglianza completa in booleani? - Java

Dipende se si sta parlando di Boolean s (l'involucro oggetto, di notare la capitale B) o boolean s (il primitivo, notare il minuscolo b). Se stai parlando di Boolean s (il wrapper dell'oggetto), come con tutti gli oggetti, == assegni per identità, non equivalenza. Se stai parlando di boolean s (primitive), controlla l'equivalenza.

Quindi:

Boolean a, b; 
a = new Boolean(false); 
b = new Boolean(false); 
System.out.println("a == b? " + (a == b)); // "a == b? false", because they're not the same instance 

Ma

boolean c, d; 
c = false; 
d = false; 
System.out.println("c == d? " + (c == d)); // "c == d? true", because they're primitives with the same value 

stringhe riguardanti:

ho sentito che se paragono 2 stringhe con == poi ho solo la volontà tornare indietro se le stringhe sono identiche e si riferiscono entrambi allo stesso oggetto/istanza ...

Non è davvero una "e": == sarà solo verifica se i due String variabili si riferiscono alla stessa istanza String. Naturalmente, un'istanza String può avere solo un set di contenuti, quindi se entrambe le variabili puntano alla stessa istanza, naturalmente i contenuti sono gli stessi ... :-) Il punto chiave è che == segnalerà false per diversoString istanze anche se hanno gli stessi caratteri nello stesso ordine. Ecco perché usiamo equals su di loro, non ==. Le stringhe possono diventare un po 'confuse a causa di interning, che è specifico per le stringhe (non esiste un equivalente per Boolean, anche se quando si utilizza Boolean.valueOf(boolean), si ottiene un oggetto memorizzato nella cache). Si noti inoltre che Java non ha corde primitivi come fa primitivo boolean, int, ecc

+0

Quindi, se io uso 'new boolean' per rendere la mia variabile, al contrario di' new Boolean', '==' sarà uguale a 'equals()'? – Bluefire

+1

@Bluefire: non si usa affatto 'new boolean' (in minuscolo). Si usa 'true' o' false' o il risultato di un'operazione di confronto. Penso che ci siano pochissimi casi d'uso in Java moderno per 'Boolean'. –

+0

Quindi per dichiarare un booleano primitivo, devo inserire qualcosa come "boolean myBoolean = true'? – Bluefire

1

Dipende se si sta parlando di tipi di valore come: int, boolean, long o sui tipi di riferimento: Integer, Boolean, Long . i tipi di valore possono essere confrontati con ==, i tipi di riferimento devono essere confrontati con equals.

1

Se si utilizza un oggetto uguale a quando non è possibile eseguire in cose come questa. (cache VM per le primitive autoboxing)

public static void main(String[] args){ 
     Boolean a = true; 
     Boolean b = true; 
     System.out.println(a == b); 
     a = new Boolean(true); 
     b = new Boolean(true); 
     System.out.println(a == b); 
    } 

l'uscita è TRUE e FALSE

+0

questo non sta migliorando la risposta, si prega di aggiungere una risposta solo se migliora le risposte già presentate –

+0

Alla risposta originale manca l'esempio di autoboxing. Mi sono imbattuto nel seguente codice: Opzionale a = f(); Opzionale b = g(); if (a.isPresent() && b.isPresent() && a.get()! = b.get()) {...} che sembra un bug. Il motivo per cui non è un bug è che f() e g() restituivano cose come Optional.of (true), ecc. E la funzione di auto-boxing lo rendeva corretto. Si noti, tuttavia, che per inti "cache" di auto-boxing valgono solo fino a 127 o qualcosa del genere, quindi è meglio evitare di fare affidamento sul "caching". –