implementacion - java compareto date
¿Por qué se implementan de forma diferente Byte.compare() y Integer.compare()? (2)
El método Byte se puede implementar de esta manera, ya que el resultado de la resta es representable en int
. Esto no es así en el otro caso. Por ejemplo:
0 - 0x80000000 == 0x80000000
y esto es negativo, por lo tanto, la comparación indicaría erróneamente que 0 es menor que -2 ^ 31
Estoy estudiando la fuente del OpenJDK.
Mi atención fue atraída por los métodos Byte.compare()
y Integer.compare()
:
public static int Byte.compare(byte x, byte y) {
return x-y;
}
public static int Integer.compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
¿Por qué los métodos Byte.compare()
y Integer.compare()
tienen implementaciones diferentes?
La implementación de Integer.compare
no utiliza la resta, ya que esto podría causar un desbordamiento en caso de que esté comparando un número entero cercano a Integer.MIN_VALUE
con otro que esté cerca de Integer.MAX_VALUE
.
Este desbordamiento no puede ocurrir en el caso de Byte.compare
, ya que allí los valores de byte se convierten implícitamente a números enteros antes de calcular xy
.
(Ver también: Especificación del lenguaje Java - 5.6.2 Promoción numérica binaria )