Cet article présente principalement l'exemple de code de la plage de valeurs entières en JAVA. Les amis qui en ont besoin peuvent s'y référer
Sans plus tarder, je publierai directement le code pour vous. le code est le suivant :
package com.test; public class Test { public static void main(String []args) { Integer a = 100;//此处若使用new,则==值必为false Integer b = 100; System.out.println(a==b);//true Integer c = 150; Integer d = 150; System.out.println(c==d);//false } }
Quelle en est la raison ?
1. Lorsque Java est compilé, Integer a = 100; est traduit en -> Integer a = Integer.valueOf(100);
2. Quand on compare, c'est encore une comparaison d'objets
3. Dans le code source du jdk
public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset]; //符合值范围时候,进入也创建好的静态IntergerCache,i+offset的值表示去取cache数组中那个下标的值 } return new Integer(i); //当不符合-128 127值范围时候。记住用的:new,开辟新的内存空间,不属于IntergerCache管理区 }
Et
private static class IntegerCache { private IntegerCache(){} static final Integer cache[] = new Integer[-(-128) + 127 + 1]; //开辟-128到127的内存区。有0的位置哦 static { for(int i = 0; i < cache.length; i++) cache[i] = new Integer(i - 128); //为内存区的数组每个对象赋值 } }
Voici l'initialisation java afin d'améliorer efficacité Un objet entier compris entre -128 et 127 est obtenu, donc l'affectation est le même objet dans cette plage.
Ajouter une autre phrase
Integer a = 100; a++; //这边a++是新创建了一个对象,不是以前的对象。 public static void main(String []args) { Integer a = 100; Integer b = a;//此时b指针指向值为100的堆地址 即a的堆地址,a==b成立 a++;//此时a指向的值发生变化为101,a指针指向101的堆地址。而b任然指向100 System.out.println(a==b);//false }
Résumé
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!