Compartir tecnología

trampa de Java 128

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

¿Qué es la trampa 128?

Veamos primero un fragmento de código.

		int a0=127;
        int a1=127;
        Integer a2=127;
        Integer a3=127;
        System.out.println(a0==a1);  // 1、运行结果是true
        System.out.println(a0==a2);  // 2、运行结果是true
        System.out.println(a2==a3);  // 3、运行结果是true
        System.out.println(a2.equals(a0)); // 注意这里必须是包装类的a2才能使用equals,a0不能使用
                                           // 4、运行结果是true
        System.out.println(a2.equals(a3)); // 5、运行结果是true
        System.out.println("-----------------------------");

        int b0=200;
        int b1=200;
        Integer b2=200;
        Integer b3=200;
        System.out.println(b0==b1);	// 6、运行结果是true
        System.out.println(b0==b2);	// 7、运行结果是true
        System.out.println(b2==b3);// 8、运行结果是false
        System.out.println(b2.equals(b0)); // 9、运行结果是true
        System.out.println(b2.equals(b3)); // 10、运行结果是true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • ¿El resultado de ejecución es el que esperaba?
    De hecho, el octavo resultado consecutivo es la llamada trampa 128.

  • La trampa Java 128 se refiere a: cuando el valor guardado por la clase de encapsulación de datos de tipo básico es mayor o igual a 128, la dirección de cada clase no es igual.No es necesario que sean 128 para aparecer.

    En pocas palabras: cuando es menor o igual a 127 y mayor o igual a -128, el valor que se encuadra automáticamente es el valor que existe en la misma dirección. Cuando es mayor que 127, el valor que es. encuadrado automáticamente no es el mismo. Es decir, siempre que el rango no sea [-128,127], usar == dará como resultado falso. Si se usa igual, el resultado será verdadero. Aunque el valor no está en el rango actual, si se usa Integer, se desempaquetará automáticamente, por lo que no habrá problema de trampa 128, por lo que la séptima ejecución es verdadera;

¿Por qué aparece la trampa 128?

Ver código fuente
	/**解释精简一部分后
     * This method will always cache values in the range -128 to 127
     */
	public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

ilustrar:
1. El valor de IntegerCache.low es -128 y el valor de IntegerCache.high es 127.
2. En el método valueOf de Integer, se almacena una matriz de caché, que es equivalente a un caché, que oscila entre -128 y 127 intervalos cerrados.
3. Cuando el valor que tomamos está entre [-128, 127], lo que se devuelve es el valor definido en la matriz IntegerCache.cache y no es necesario crear un nuevo objeto.
4. Cuando el valor no está en el rango, es necesario crear un nuevo objeto. El nuevo objeto == es la dirección del juicio, que es igual al valor del objeto juzgado, que es verdadero;

Cosas a tener en cuenta al enfrentar la trampa 128

  • Si el objeto se crea nuevo (como se muestra a continuación), no habrá trampa 128. (Esto implica desembalaje y embalaje automático, escribiré una introducción aquí más adelante)
    La razón es que las direcciones de memoria de los objetos producidos por new son diferentes y los objetos que se comparan no son los mismos.
	Integer k1 = new Integer(100);
    Integer k2 = new Integer(100);
    System.out.println(k1==k2);  // 运行结果false
    System.out.println(k1.equals(k2)); // 运行结果true
  • 1
  • 2
  • 3
  • 4
  • Al comparar valores, puede utilizar el método igual.


Documentación de referencia:
https://blog.csdn.net/niu_8865/article/details/110791911
https://blog.csdn.net/DianLanHong/article/details/119617352
https://blog.csdn.net/Yangyeon_/article/details/135611919