Java Language The Equality Operators (==,! =)

Esempio

Gli operatori == e != Sono operatori binari che valutano true o false seconda che gli operandi siano uguali. L'operatore == restituisce true se gli operandi sono uguali e false altrimenti. L'operatore !=false se gli operandi sono uguali e true altrimenti.

Questi operatori possono essere utilizzati operandi con tipi primitivi e di riferimento, ma il comportamento è significativamente diverso. Secondo JLS, ci sono in realtà tre serie distinte di questi operatori:

  • Gli operatori booleani == e != .
  • Gli operatori numerici == e != .
  • Gli operatori di riferimento == e != .

Tuttavia, in tutti i casi, il tipo di risultato degli operatori == e != È boolean .

Gli operatori numerici == e !=

Quando uno (o entrambi) degli operandi di un operatore == o != È un tipo numerico primitivo ( byte , short , char , int, long , float o double ), l'operatore è un confronto numerico. Il secondo operando deve essere un tipo numerico primitivo o un tipo numerico in scatola.

Il comportamento di altri operatori numerici è il seguente:

  1. Se uno degli operandi è di tipo boxed, è unbox.
  2. Se uno degli operandi ora è un byte , short o char , viene promosso a un int .
  3. Se i tipi di operandi non sono gli stessi, l'operando con il tipo "più piccolo" viene promosso al tipo "più grande".
  4. Il confronto viene quindi eseguito come segue:
    • Se gli operandi promossi sono int o long i valori vengono testati per vedere se sono identici.
    • Se gli operandi promossi sono float o double allora:
      • le due versioni di zero ( +0.0 e -0.0 ) sono considerate uguali
      • un valore NaN viene trattato come non uguale a nulla, e
      • altri valori sono uguali se le loro rappresentazioni IEEE 754 sono identiche.

Nota: è necessario fare attenzione quando si utilizza == e != Per confrontare i valori in virgola mobile.

Gli operatori booleani == e !=

Se entrambi gli operandi sono boolean , o uno è boolean e l'altro è Boolean , questi operatori sono gli operatori booleani == e != . Il comportamento è il seguente:

  1. Se uno degli operandi è un Boolean , è unbox.
  2. Gli operandi unbox vengono testati e il risultato booleano viene calcolato in base alla seguente tabella di verità
UN B A == B A! = B
falso falso vero falso
falso vero falso vero
vero falso falso vero
vero vero vero falso

Ci sono due "trappole" che rendono consigliabile usare == e != parsimonia con valori di verità:

Gli operatori di riferimento == e !=

Se entrambi gli operandi sono riferimenti a oggetti, gli operatori == e != Testano se i due operandi si riferiscono allo stesso oggetto . Questo spesso non è quello che vuoi. Per verificare se due oggetti sono uguali per valore , dovrebbe essere usato il metodo .equals() .

String s1 = "We are equal";
String s2 = new String("We are equal");

s1.equals(s2); // true

// WARNING - don't use == or != with String values
s1 == s2;      // false

Avvertenza: l'uso di == e != Per confrontare i valori di String non è corretto nella maggior parte dei casi; vedere http://www.Scriptutorial.com/java/example/16290/pitfall--using- to- compare- strings . Un problema simile si applica ai tipi di wrapper primitivi; vedi http://www.Scriptutorial.com/java/example/8996/pitfall--using- a- compare- primitive-wrappers- objects- such- as- integer .

Informazioni sui casi limite di NaN

JLS 15.21.1 afferma quanto segue:

Se uno degli operandi è NaN , il risultato di == è false ma il risultato di != È true . In effetti, il test x != x è true se e solo se il valore di x è NaN .

Questo comportamento è (per la maggior parte dei programmatori) inaspettato. Se si verifica se un valore NaN è uguale a se stesso, la risposta è "No non lo è!". In altre parole, == non è riflessivo per i valori NaN .

Tuttavia, questa non è una "stranezza" di Java, questo comportamento è specificato negli standard IEEE 754 a virgola mobile, e scoprirete che è implementato dalla maggior parte dei moderni linguaggi di programmazione. (Per ulteriori informazioni, consultare http://stackoverflow.com/a/1573715/139985 ... notando che questo è scritto da qualcuno che era "nella stanza quando sono state prese le decisioni"!)