Partage de technologie

Piège Java 128

2024-07-12

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

Quel est le piège 128

Regardons d'abord un morceau de code

		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
  • Le résultat est-il conforme à mes attentes ?
    En fait, le 8ème résultat en cours est ce qu'on appelle le piège 128.

  • Le piège Java 128 fait référence à : lorsque la valeur enregistrée par la classe d'encapsulation des données de type de base est supérieure ou égale à 128, l'adresse de chaque classe n'est pas égale.Il n’est pas nécessaire qu’il y en ait 128 pour apparaître.

    Pour faire simple : lorsqu'elle est inférieure ou égale à 127 et supérieure ou égale à -128, la valeur qui est automatiquement encadrée est la valeur qui existe à la même adresse. Lorsqu'elle est supérieure à 127, la valeur qui est. automatiquement mis en boîte n'est pas le même. Autrement dit, tant que la plage n'est pas [-128,127], l'utilisation de == entraînera false. Si égal est utilisé, le résultat sera vrai. Et bien que la valeur ne soit pas dans la plage actuelle, si Integer est utilisé, elle sera automatiquement déballée, donc il n'y aura pas de problème de piège 128, donc la septième exécution est vraie ;

Pourquoi le piège 128 apparaît-il ?

Afficher le code source
	/**解释精简一部分后
     * 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

illustrer:
1. La valeur d'IntegerCache.low est -128 et la valeur d'IntegerCache.high est de 127.
2. Dans la méthode valueOf de Integer, un tableau de cache est stocké, ce qui équivaut à un cache, allant de -128 à 127 intervalles fermés.
3. Lorsque la valeur que nous prenons est comprise entre [-128, 127], la valeur renvoyée est la valeur définie dans le tableau IntegerCache.cache, et il n'est pas nécessaire de créer un nouvel objet.
4. Lorsque la valeur n'est pas dans la plage, un nouvel objet doit être créé. Le nouvel objet == est l'adresse du jugement, qui est fausse ; est égal à la valeur de l'objet jugé, qui est vrai.

Choses à noter face au piège 128

  • Si l'objet est créé par new (comme indiqué ci-dessous), il n'y aura pas de piège 128. (Cela implique un déballage et un emballage automatiques, j'écrirai une introduction ici plus tard)
    La raison en est que les adresses mémoire des objets produits par new sont différentes et que les objets comparés ne sont pas les mêmes.
	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
  • Lorsque vous comparez des valeurs, vous pouvez utiliser la méthode égale


Documentation de référence :
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