Un asesinato causado por Integer

Los estudiantes que hayan leído el manual de desarrollo de Alibaba deberían tener una pequeña impresión del valor crítico entero de 127.

El texto original dice:

[Obligatorio] Todas las comparaciones de valores entre objetos contenedores de enteros deben realizarse mediante el método equals.

Nota: Para la asignación de Integer var = ? entre -128 y 127, el objeto Integer se genera en IntegerCache.cache,

Los objetos existentes se reutilizarán. Los valores enteros en este rango se pueden juzgar directamente usando ==, pero todos los datos fuera de este rango son

Se generará en el montón y no reutilizará los objetos existentes. Este es un pozo grande. Se recomienda usar el método de igualdad para el juicio.

Así es, el artículo requiere que se usen iguales al comparar objetos Integer.

Entonces muchos estudiantes no tienen idea de por qué hacen esto. Tampoco siento mucho por IntegerCache.cache.

Muchas veces el código que escribimos puede verse así:

Integer num = 127;

if(num==128){
    
    
	//...
}

En este caso, cuando comparemos Integer con un número, no habrá problema.

Entonces si escribimos

Integer num1 = 127;
num1++;
Integer num2=  128;
if (num1 == num2) {
    
    
    System.out.println(true);
}
else{
    
    
    System.out.println(false);
}

Ocurrió algo mágico: aunque num1 y num2 son ambos 128, no son iguales.

Esto se debe a que si el valor de Integer está entre -128 y 127, Integer no creará un nuevo objeto, sino que se tomará de IntegerCache.cache, por lo que no hay problema en compararlos casualmente.

Pero si supera este rango, será diferente.

Si no me crees, puedes probar con el siguiente código:

Integer num1 = 127;
Integer num2=  127;
if (num1 == num2) {
    
    
    System.out.println(true);
}
else{
    
    
    System.out.println(false);
}

=================================

Es una pena que este punto a menudo se olvide en el trabajo, por lo que ocurrió un asesinato.

Aquí hay un fragmento de código que escribí hace algún tiempo:

String standardItemNameStr = sampleStandardItemList.stream()
  .filter(item -> item.getSampleId()==sample.getSampleId())
  .map(item -> item.getStandardItemName()).collect(Collectors.joining("、"));

Cuando se lanzó el sistema por primera vez, todo estaba BIEN y el funcionamiento era normal. De repente, algo sucedió un día. Los clientes han informado errores.

El lugar donde deberían haberse mostrado los datos se ha convertido en un valor nulo.

Lo probé localmente, todo está bien. El código ha sido probado más de diez veces y no se han encontrado problemas.

ABAJO los datos del entorno de producción y ejecútelos para encontrar que item.getSampleId()el valor en la segunda línea es 180. En este momento, de repente recordé la configuración de Integer. Aparte de cualquier otra cosa, modifíquelo al siguiente código, y todo volverá a la normalidad.

String standardItemNameStr = sampleStandardItemList.stream()
    .filter(item -> item.getSampleId() .equals(sample.getSampleId()))
    .map(item -> item.getStandardItemName()).collect(Collectors.joining("、"));

Aunque este problema es muy simple, todavía es fácil de ignorar. A partir de esto, también amplié mi pensamiento y probé las clases de empaque Doble y Flotante. No existe tal idea de diseño como atrapar.

La razón debería ser muy simple. Integer es un número entero. Muchas veces, cuando usamos Integer, el valor que necesitamos usar es relativamente pequeño, por lo que hacer una captura oficial puede mejorar la eficiencia de ejecución, y la tasa de aciertos de caché sigue siendo. relativamente alto, pero el uso principal de los decimales es en decimales. Si quieres atrapar, el número es demasiado.

Entonces, ¿las clases de empaquetado de byte, corto y largo también tendrán un diseño de captura? Mientras lee, es posible que desee escribir un programa de prueba, experimentar y luego volver y contarme en el área de comentarios.

El manual de desarrollo de Alibaba mencionado en el artículo es un libro muy bueno. Otro artículo mío recopiló el conjunto completo de manuales de Alibaba. Los estudiantes interesados ​​​​pueden ir y echar un vistazo:
se le dará el conjunto completo del manual de desarrollo de Alibaba y la interpretación del maestro [finalización de 2022]

Supongo que te gusta

Origin blog.csdn.net/aley/article/details/127759724
Recomendado
Clasificación