Compartilhamento de tecnologia

Armadilha Java 128

2024-07-12

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

Qual é a armadilha 128

Vejamos primeiro um trecho 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
  • O resultado da corrida é o que eu esperava?
    Na verdade, o 8º resultado consecutivo é a chamada armadilha 128.

  • A armadilha Java 128 refere-se a: quando o valor salvo pela classe de encapsulamento de dados do tipo básico é maior ou igual a 128, o endereço de cada classe não é igual.Não precisa ser 128 para aparecer.

    Simplificando: quando é menor ou igual a 127 e maior ou igual a -128, o valor que é automaticamente encaixotado é o valor que existe no mesmo endereço. Quando é maior que 127, o valor que é. encaixotado automaticamente não é o mesmo. Ou seja, desde que o intervalo não seja [-128.127], usar == resultará em falso. Se igual for usado, o resultado será verdadeiro. Embora o valor não esteja no intervalo atual, se Integer for usado, ele será automaticamente desembalado, portanto não haverá problema de trap 128, portanto a sétima execução é verdadeira;

Por que a armadilha 128 aparece?

Ver código-fonte
	/**解释精简一部分后
     * 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. O valor de IntegerCache.low é -128 e o valor de IntegerCache.high é 127.
2. No método valueOf de Integer, é armazenado um array de cache, que equivale a um cache, variando de -128 a 127 intervalo fechado.
3. Quando o valor que tomamos está entre [-128, 127], o valor retornado é o valor definido no array IntegerCache.cache e não há necessidade de criar um novo objeto.
4. Quando o valor não está no intervalo, um novo objeto precisa ser criado. O novo objeto == é o endereço do julgamento, que é falso é igual ao valor do objeto que é julgado, que é verdadeiro.

Coisas a serem observadas ao enfrentar a armadilha 128

  • Se o objeto for criado como novo (conforme mostrado abaixo), não haverá armadilha 128. (Isso envolve desembalagem e embalagem automáticas, escreverei uma introdução aqui mais tarde)
    A razão é que os endereços de memória dos objetos produzidos por new são diferentes e os objetos comparados não são os mesmos.
	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
  • Ao comparar valores, você pode usar o método equals


Documentação de referência:
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