public static void main(String[] args) { Integer a = 127, b = 127; Integer c = 128, d= 128; System.out.println(a == b); // true System.out.println(c == d); // false }
public static Integer valueOf(int i) { // -128 - 127 if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
public static void main(String[] args) { long startTime = System.currentTimeMillis(); Integer count = 0; // int count = 0; for (int i = 0; i < 5000000; i++) { count += i; } System.out.println("计算时长:" + (System.currentTimeMillis() - startTime) + " ms"); } // 执行结果: // Integer 计算时长:51 ms // int 计算时长:6 msその後、実行結果から、頻繁に新しいオブジェクトが自動的にボックス化され、メモリが割り当てられ、時間と空間のパフォーマンス損失が発生していることが明確にわかります。 簡単なまとめ上記のソース コードの読み取りとテスト分析を通じて、通常、統計を計算したりメソッドにパラメーターを入力したりする場合は、このタイプを回避する必要があるという結論を導き出すことができます。 。コード全体の実行効率を向上させるため。 アンボックス化 (intValue)アンボックス化には複雑なロジックはなく、値の基本型を直接返します。 補足: 自動ボックス化とボックス化解除は常に行われますか? ######必ずしも。以下のサンプルコードを見てください。出力結果は出力ステートメントの後にコメント化されています。
public static void main(String[] args) { // TODO 自动生成的方法存根 Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Integer e = 321; Integer f = 321; Long g = 3L; System.out.println(c==d);//true //包装类的==在没有遇到算术运算的情况下不会自动拆箱 System.out.println(e==f);//false System.out.println(c==(a+b));//true System.out.println(c.equals(a+b));//true System.out.println(g==(a+b));//true //equals方法不会处理数据转型关系 System.out.println(g.equals(a+b));//false }
// 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"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } 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++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} } public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }IntegerCache は Integer の静的内部クラスで、valueOf() はパッケージ化メソッドです。ソース コードからわかるように、cache はキャッシュ配列です。valueOf() メソッドの入力パラメータ i が [-128,127] の範囲にある場合、キャッシュ配列の整数値が返されます。それ以外の場合は、新しい値が返されます。整数が作成されます。 System.out.println(c==d); と System.out.println(e==f); の出力結果が異なるのはこれが理由です。 c と d はキャッシュ間隔内にあるため、同じ参照を返します。一方、e と f はキャッシュ間隔内にないため、同じ参照ではない新しい整数を返します。
以上がJava の自動ボックス化およびボックス化解除ソース コード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。