Regardez d'abord les résultats ci-dessous
1.System.out.println(127==127); //true , int type compare2.System.out.println(128==128); //true , int type compare3.System.out.println(new Integer(127) == new Integer(127)); //false, object compare4.System.out.println(Integer.parseInt("128")==Integer.parseInt("128")); //true, int type compare5.System.out.println(Integer.valueOf("127")==Integer.valueOf("127")); //true ,object compare, because IntegerCache return a same object6.System.out.println(Integer.valueOf("128")==Integer.valueOf("128")); //false ,object compare, because number beyond the IntegerCache7.System.out.println(Integer.parseInt("128")==Integer.valueOf("128")); //true , int type compare
Explication
Lors de la comparaison de constantes entières entières, == est une comparaison de valeurs. Donc 1,2 renvoie vrai. 1, 2 sont des comparaisons de valeurs.
new Integer() construit un nouvel objet Integer à chaque fois, donc 3 renvoie false. 3 est une comparaison d’objets.
Integer.parseInt construit une constante int à chaque fois, donc 4 renvoie vrai. 4 est une comparaison de valeurs.
Integer.valueOf renvoie un objet Integer. Par défaut, il renvoie un objet existant dans le cache (s'il existe) entre -128 et 127, donc 5 renvoie vrai et 6 renvoie faux. 5 et 6 sont des comparaisons d'objets.
Le septième est spécial, c'est une comparaison entre int et Integer. Le résultat est une comparaison de valeur et renvoie vrai.
Résumé
Pour une comparaison d'entiers, déterminez d'abord s'il s'agit d'une comparaison de valeurs ou d'une comparaison d'objets. La comparaison de valeurs retournera certainement vrai si l'une d'entre elles est une. valeur, c'est une comparaison de valeur. La comparaison des objets dépend de la façon dont l'objet est construit. Si la nouvelle méthode Integer est utilisée, un nouvel objet sera généré à chaque fois. La comparaison de deux nouveaux Integer renverra certainement false. S'il s'agit de la méthode Integer.valueOf, faites attention à savoir si. la plage de valeurs est comprise entre -128 et 127, si c'est le cas, les objets construits avec la même valeur sont le même objet == renvoie vrai après comparaison, sinon il renvoie faux.
Donc, pour la comparaison de valeurs ==, il n'y a pas de problème. Pour la comparaison d'entiers, il est préférable d'utiliser la méthode égale pour comparer le contenu de l'objet. Bien sûr, assurez-vous d'abord de déterminer si l'entier ne l'est pas. nul.
Extension des connaissances
Analyser le code source Integer.valueOf
1 La méthode Integer.valueOf que nous appelons, elle appelle d'abord parseInt pour le convertir. pour saisir la valeur int, puis ajuster sa propre méthode surchargée
public static Integer valueOf(String s) throws NumberFormatException {return Integer.valueOf(parseInt(s, 10)); }
2. La méthode surchargée Integer.valueOf, en fonction de la taille de la valeur i, détermine s'il faut récupérer un entier objet du cache
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i); }
3. Le constructeur d'Integer est très simple
public Integer(int value) {this.value = value; }
4. classe interne de Integer , trois attributs (un tableau Integer mis en cache + un ensemble de plages de cache)
private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by property(最大值可配置)int h = 127; String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); //读取VM参数if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue); //配置值转换成int数值i = Math.max(i, 127); //和127比较,取较大者// Maximum array size is Integer.MAX_VALUE(控制缓存数组的大小,最大为整型的最大值,这样一来,h值就必须小于整型最大值,因为要存 -128~0这129个数嘛)h = Math.min(i, Integer.MAX_VALUE - (-low) -1); //实际就是 h=Math.min(i,Integer.MAX_VALUE-129),正整数能缓存的个数} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; //构造缓存数组int j = low;for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); //将一些int常量缓存进Integer对象数组缓存中去// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127; //如果小于127,抛异常}private IntegerCache() {} }
Après avoir lu le code source Integer.valueOf ci-dessus, vous constaterez que la valeur par défaut Cache entier Le pool de constantes int est configurable. La méthode de configuration consiste à ajouter des paramètres de VM et à ajouter : -Djava.lang.Integer.IntegerCache.high=200
Intellij IDEA. la configuration d'exécution.
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!