Teknologian jakaminen

Java 128 trap

2024-07-12

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

Mikä on 128 ansa

Katsotaanpa ensin koodinpätkä

		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
  • Onko juoksutulos sitä mitä odotin?
    Itse asiassa kahdeksas juoksutulos on niin sanottu 128 trap.

  • Java 128 -trap viittaa: kun perustyyppisten tietojen kapselointiluokan tallentama arvo on suurempi tai yhtä suuri kuin 128, kunkin luokan osoite ei ole sama.Sen ei tarvitse olla 128, jotta se näkyy.

    Yksinkertaisesti sanottuna: kun se on pienempi tai yhtä suuri kuin 127 ja suurempi tai yhtä suuri kuin -128, arvo, joka on automaattisesti laatikossa, on samassa osoitteessa oleva arvo. Kun se on suurempi kuin 127, se on automaattisesti boxed ei ole sama. Eli niin kauan kuin alue ei ole [-128,127], ==:n käyttö johtaa epätosi. Jos käytetään yhtä suuria, tulos on tosi. Vaikka arvo ei ole nykyisellä alueella, jos kokonaislukua käytetään, se poistetaan automaattisesti, joten 128 trap -ongelmaa ei synny, joten seitsemäs ajo on tosi;

Miksi 128-ansa ilmestyy?

Näytä lähdekoodi
	/**解释精简一部分后
     * 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

havainnollistaa:
1. Kohteen IntegerCache.low arvo on -128 ja IntegerCache.high -arvon arvo on 127.
2. Integer-metodissa valueOf tallennetaan välimuistitaulukko, joka vastaa välimuistia ja jonka väli on -128 - 127 suljettu.
3. Kun ottamamme arvo on välillä [-128, 127], palautetaan IntegerCache.cache-taulukossa määritetty arvo, eikä uutta objektia tarvitse luoda.
4. Kun arvo ei ole alueella, on luotava uusi objekti. Uusi objekti == on tuomion osoite, joka on yhtä kuin arvioitavan kohteen arvo, joka on tosi.

Huomioitavaa, kun kohtaat 128-ansan

  • Jos objekti on luotu uudella (kuten alla on esitetty), 128 trap ei tule olemaan. (Tämä sisältää automaattisen purkamisen ja pakkaamisen, kirjoitan esittelyn tähän myöhemmin)
    Syynä on se, että uusien tuottamien objektien muistiosoitteet ovat erilaiset ja vertailtavat objektit eivät ole samoja.
	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
  • Kun vertaat arvoja, voit käyttää yhtäläisyysmenetelmää


Viitedokumentaatio:
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