Heim  >  Artikel  >  Java  >  Eingehende Analyse des Java-Unboxings

Eingehende Analyse des Java-Unboxings

高洛峰
高洛峰Original
2017-01-24 13:57:281127Durchsuche

Schauen wir uns zuerst einen Code an:

public class Main{
  public static void main(String[] args){
 
    Integer num1 = 100;
    Integer num2 = 100;
    Integer num3 = 200;
    Integer num4 = 200;
 
    '''//输出结果'''
    System.out.println(num1==num2);
    System.out.println(num3==num4);
  }
}


Raten Sie mal, was das Ergebnis ist?

Viele Leute werden denken, dass die Ergebnisse alle wahr sind, aber die Ergebnisse sind nicht so

wahr
falsch

Warum ist das das Ergebnis? Wenn Sie den Speicher zum Interpretieren der Ergebnisse verwenden, verweisen Num1 und Num2 auf dasselbe Objekt, während Num3 und Num4 auf unterschiedliche Objekte verweisen. Als nächstes werde ich Ihnen erklären, warum. Schauen Sie sich den Quellcode der valueof-Methode vom Typ Integer an:

public static Integer valueOf(int i) {
  assert IntegerCache.high >= 127;
  if (i >= IntegerCache.low && i <= IntegerCache.high)
    return IntegerCache.cache[i + 128];
  return new Integer(i);
  }


Die Implementierung von IntegerCache:

&#39;&#39;&#39;// IntegerCache,一个内部类,注意它的属性都是定义为static final&#39;&#39;&#39;
  private static class IntegerCache {
    static final int high; &#39;&#39;&#39;//缓存上界,暂为null&#39;&#39;&#39;
    static final Integer cache[]; &#39;&#39;&#39;//缓存的整型数组&#39;&#39;&#39;
 
    &#39;&#39;&#39;// 块,为什么定义为块&#39;&#39;&#39;
    static {
      final int low = -128; &#39;&#39;&#39;// 缓存下界,不可变了。只有上界可以改变&#39;&#39;&#39;
 
      &#39;&#39;&#39;// high value may be configured by property&#39;&#39;&#39;
      &#39;&#39;&#39;// h值,可以通过设置jdk的AutoBoxCacheMax参数调整(以下有解释),自动缓存区间设置为[-128,N]。注意区间的下界是固定&#39;&#39;&#39;
      int h = 127;
 
      if (integerCacheHighPropValue != null) {
        &#39;&#39;&#39;// Use Long.decode here to avoid invoking methods that&#39;&#39;&#39;
        &#39;&#39;&#39;// require Integer&#39;s autoboxing cache to be initialized&#39;&#39;&#39;
        // 通过解码integerCacheHighPropValue,而得到一个候选的上界值&#39;&#39;&#39;
        int i = Long.decode(integerCacheHighPropValue).intValue();
        &#39;&#39;&#39;// 取较大的作为上界,但又不能大于Integer的边界MAX_VALUE&#39;&#39;&#39;
        i = Math.max(i, 127);  
        &#39;&#39;&#39;// Maximum array size is Integer.MAX_VALUE&#39;&#39;&#39;
        h = Math.min(i, Integer.MAX_VALUE - -low);
      }
      high = h; &#39;&#39;&#39;//上界确定&#39;&#39;&#39;
      &#39;&#39;&#39;// 就可以创建缓存块,注意缓存数组大小&#39;&#39;&#39;
      cache = new Integer[(high - low) + 1]; //
      int j = low;
      for(int k = 0; k < cache.length; k++)
        cache[k] = new Integer(j++); &#39;&#39;&#39;// -128到high值逐一分配到缓存数组&#39;&#39;&#39;
    }
 
    private IntegerCache() {}
  }


Aus diesen beiden Codeteilen ist ersichtlich, dass beim Erstellen eines Objekts vom Typ Integer über die Methode valueof die Der Wertebereich ist [-128.127] und der Wert In diesem Bereich zeigt der Zeiger auf eine Objektreferenz, die bereits in IntegerCache.cache vorhanden ist. Wenn der Wert diesen Bereich überschreitet, wird ein neues Objekt erstellt.

Zu beachten ist, dass nicht alle Typen in diesem Bereich liegen:

public class Main{
  public static void main(String[] args){
 
    Double i1 = 100.0;
    Double i2 = 100.0;
    Double i3 = 200.0;
    Double i4 = 200.0;
 
    System.out.println(i1==i2);
    System.out.println(i3==i4);
  }
}


Das endgültige Ausgabeergebnis:

false
false

Warum tritt dieses Ergebnis konkret auf? Sie können sich die Implementierung der Double valueof-Methode im Quellcode ansehen, die ähnlich ist zur Integer-Wert-Methode. Der Unterschied besteht darin, dass die Anzahl der Ganzzahlwerte innerhalb eines bestimmten Bereichs begrenzt ist, Gleitkommazahlen jedoch nicht.

Beachten Sie, dass die Implementierung der valueOf-Methode der Klassen Integer, Short, Byte, Character und Long ähnlich ist.
Die Implementierung der valueOf-Methode von Double und Float ist ähnlich.

Eins nach unten gezogen, und das boolesche Ergebnis hat zwei True oder False. Schauen Sie sich direkt den Quellcode an:

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
  }


und TRUE und FALSE sind wie folgt definiert:

public static final Boolean TRUE = new Boolean(true);
 
&#39;&#39;&#39;/** &#39;&#39;&#39;
&#39;&#39;&#39;* The <code>Boolean</code> object corresponding to the primitive &#39;&#39;&#39;
&#39;&#39;&#39;* value <code>false</code>. &#39;&#39;&#39;
&#39;&#39;&#39;*/&#39;&#39;&#39;
public static final Boolean FALSE = new Boolean(false);


Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.

Weitere Artikel zur ausführlichen Analyse des Java-Unboxings finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn