¿Está garantizado que new Integer (i) == i en Java?
-
26-09-2019 - |
Pregunta
Considere el siguiente fragmento:
int i = 99999999;
byte b = 99;
short s = 9999;
Integer ii = Integer.valueOf(9); // should be within cache
System.out.println(new Integer(i) == i); // "true"
System.out.println(new Integer(b) == b); // "true"
System.out.println(new Integer(s) == s); // "true"
System.out.println(new Integer(ii) == ii); // "false"
Es obvio por qué la última línea Siempre impresiones "false"
: estamos utilizando la comparación de identidad de referencia ==
, y un objeto new
nunca ser ==
a un objeto ya existente .
La pregunta es acerca de las 3 primeras líneas: son aquellas comparaciones garantizada para estar en el int
primitiva, con la auto-Integer
sacó de la caja? ¿Hay casos en que la primitiva sería automático en caja de cambio, y se realizan comparaciones de identidad de referencia? (Lo que todo ser entonces false
!)
Solución
Sí. JLS §5.6.2 especifica el reglas para la promoción numérica binaria. En parte:
Cuando se aplica un operador binario promoción numérica a un par de operandos, cada uno de los cuales debe denotar una valor que se puede convertir en un valor numérico tipo, se aplican las siguientes reglas, en orden, conversión utilizando ensanchamiento (§5.1.2) para convertir operandos como necesario:
Si cualquiera de los operandos es de un tipo de referencia, la conversión unboxing (§5.1.8) se realiza.
aplica promoción numérica binaria por varios operadores numéricos, incluyendo "los operadores de igualdad numéricos == y! =."
JLS §15.21.1 (Igualdad numérica Operadores == y! =) especifica:
Si los operandos de una igualdad operador son ambos de tipo numérico, o uno es de tipo numérico y el otro es convertible (§5.1.8) a numérico tipo, promoción numérica binaria es realizado en los operandos (§5.6.2).
En contraste, JLS §15.21.3 (! == Igualdad Operadores de referencia y =) establece lo siguiente:
Si los operandos de una igualdad operador son ambos de cualquiera de referencia escriba o el tipo null, entonces la operación es igualdad de objetos
Esto encaja con la comprensión común de boxeo y unboxing, eso es todo sólo se realiza cuando hay una falta de coincidencia.
Otros consejos
La primera vez que va a explicar precisamente cuando ==
es una igualdad de referencia, y precisamente cuando Es una igualdad numérica. Las condiciones para la igualdad de referencia es más simple, por lo que se explicará en primer lugar.
operadores de igualdad de Referencia 15.21.3 JLS ==
y !=
Si los operandos de un operador de igualdad son ambos de cualquiera de los tipos de referencia o la nula tipo, entonces la operación es la igualdad objeto.
Esto explica lo siguiente:
System.out.println(new Integer(0) == new Integer(0)); // "false"
Los dos operandos son Integer
, que son los tipos de referencia, y por eso el ==
es comparación de igualdad de referencia, y dos objetos new
nunca serán ==
el uno al otro, así que por eso que imprime false
.
Para ==
sea igualdad numérica, al menos uno de los operando debe ser un tipo numérico ; esto se especifica como sigue:
Operadores de igualdad numérica 15.21.1 JLS ==
y !=
Si los operandos de un operador de igualdad son ambos de tipo numérico, o uno es de tipo numérico y el otro es convertible a numérico tipo, promoción numérica binaria se realiza en los operandos. Si el tipo promovido de los operandos es
int
olong
, a continuación, una prueba de la igualdad de número entero se lleva a cabo; si el tipo es promovidofloat or
double`, a continuación, una prueba de igualdad de punto flotante se realiza.Tenga en cuenta que binarios realiza promoción numérica valor de ajuste de conversión y la conversión unboxing.
Por lo tanto, tenga en cuenta lo siguiente:
System.out.println(new Integer(0) == 0); // "true"
Esta impresiones true
, ya que:
- el operando derecho es un tipo
int
numérico - el operando de la izquierda es convertible a un tipo numérico, por unboxing a
int
- Por lo tanto,
==
es una operación numérica igualdad
Resumen
- Si ambos operandos de
==
y!=
son los tipos de referencia, que será siempre una operación de la igualdad de referencia- No importa si los operandos son convertibles a tipos numéricos
- Si al menos uno de los operandos es un tipo numérico, que será siempre una operación numérica igualdad
- Auto-unboxing en un (a lo más!) De los operandos se llevará a cabo si es necesario
Referencias
- JLS 4,2. Tipos y valores primitivos
- "El tipos numéricos son los tipos integrales y los tipos de coma flotante."
- Guía del lenguaje Java / Autoboxing
- JLS 5.1.8 Contenido de la caja de conversión
- Operadores de igualdad numérica 15.21.1 JLS
==
y!=
- operadores de igualdad de Referencia 15.21.3 JLS
==
y!=
- JLS 5.6.2 numérico binario Promoción