2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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
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;
/**解释精简一部分后
* 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);
}
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.
Integer k1 = new Integer(100);
Integer k2 = new Integer(100);
System.out.println(k1==k2); // 运行结果false
System.out.println(k1.equals(k2)); // 运行结果true
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